下面是一个简单的文件路径plain-C例程,它应该以编程方式展开平铺符并接受空白作为文件名中的合法字符它可以很好地处理以下名称:
~/Test文件夹/Test.txt
/用户/Shared/Test文件夹/Test.txt
但是,如果将文件图标拖放到Terminal.app的窗口中,则似乎无法使用Apple建议的路径语法或Terminal.app生成的路径语法:
/用户/Shared/Test\Folder/Test.txt
或
~/Test\Folder/Test.txt文件
这是密码很明显,我缺少了将“转义空白”替换为“纯空白”字符的例程另一方面,任何对“\”的搜索例程都会导致编译器对“未知转义序列”0x20的抱怨(顺便说一下,在某些unix和linux系统中,这似乎是有效的空白代码,可能不在OSX中?).
在我知道解决方案很简单的地方,在普通C和C字符串中是否有解决方案,而不必处理苹果专有的CFStrings和NSStrings我只是负担不起在这个项目中使用这些另外,请不要使用shell脚本、ruby、gawk、grep、perl、python等。
提前谢谢!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wordexp.h>
void get_file_path(char path[])
{
char *p;
size_t len = 0;
wordexp_t exp_result;
printf("Enter file name: \n");
p = fgets(path, TEXT_SIZE, stdin);
fflush(stdin);
if(p != NULL)len = strlen(path);
//get rid of newline characters
for(p = path; p < path + len; p++){
if(*p == '\n') *p = '\0';
}
if(path[0] == '~'){
wordexp(path, &exp_result, 0);
//printf("Num.expansions: %zd\n", exp_result.we_wordc);
strcpy(path, exp_result.we_wordv[0]);
for(size_t i = 1; i < exp_result.we_wordc; i++){
//printf("%s\n", exp_result.we_wordv[i]);
strcat(path, " ");
strcat(path, exp_result.we_wordv[i]);
}
wordfree(&exp_result);
}
printf("File path: %s\n", path);
return;
}
下面是shell输出:
Enter file name:
/Users/Shared/Test\ Folder/test.txt
File path: /Users/Shared/Test\ Folder/test.txt
Can't open file: /Users/Shared/Test\ Folder/test.txt
最佳答案
这不是对代码主要问题的回答,而是代码的问题。if(path[0] == '~'){
是一个微妙的问题。
p = fgets(path, TEXT_SIZE, stdin);
...
if(path[0] == '~'){
当
p == NULL
时,path
的内容未在IO错误上定义,并且很可能在发生EOF
时出现以前的缓冲区内容最好将返回类型从void
更改为char *
,并在p == NULL
时返回。p = fgets(path, TEXT_SIZE, stdin);
if (p == NULL) {
return NULL;
}
关于c - 路径osx/unix/darwin中的转义空格,纯C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28436295/