【发布时间】:2015-04-10 18:11:52
【问题描述】:
这是一个简单的文件路径纯 C 例程,它应该以编程方式扩展波浪线并接受空格作为文件名中的合法字符。它适用于以下名称:
~/测试文件夹/test.txt
/Users/Shared/测试文件夹/test.txt
但如果将文件的图标拖放到 Terminal.app 的窗口,则似乎不适用于 Apple 建议的路径语法或 Terminal.app 生成的路径语法:
/Users/Shared/Test\文件夹/test.txt
或
~/Test\文件夹/test.txt
这是代码。我显然错过了将“转义空格”替换为“纯空格”字符的例程。另一方面,任何搜索 '\' 的例程都会导致编译器抱怨“未知转义序列”0x20(顺便说一句,这似乎是某些 unix 和 linux 系统中的有效空白代码,在 OSX 中可能不是?)。
是否有解决纯 C 和 C 字符串问题的方法,而无需处理 Apple 专有的 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;
}
这是外壳输出:
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
【问题讨论】:
-
您不需要将
"\ "替换为" ",因为这将由shell AFAIK 完成。 -
如果是这样,任何提到的路径语法都可以工作。但既然它没有,它似乎 不是 由 shell 完成的,不管有没有原因。请随意尝试一下。我已经发布了代码。
-
我没有 Mac,所以它的行为可能会有所不同。
-
Mac 使用 bash 作为默认 shell。它在那里的工作方式与在 Linux 上相同。
-
你测试过这个例子吗?我知道它应该可以在 Linux 上运行?然而,我有点担心从理论上讨论 bash 作为默认 shell,应该在任一系统上都可以正常工作,这似乎有点离题了。