我想使用opendir
打开一个目录,但看到一些意想不到的东西。 opendir
适用于从getcwd
返回的字符串,但不适用于我的帮助函数read_cwd
中的字符串,即使字符串看起来相等。
如果我打印字符串,则打印/Users/gwg/x
,这是当前的工作目录。
这是我的代码:
char real_cwd[255];
getcwd(real_cwd, sizeof(real_cwd));
/* This reads a virtual working directory from a file */
char virt_cwd[255];
read_cwd(virt_cwd);
/* This prints "1" */
printf("%d\n", strcmp(real_cwd, virt_cwd) != 0);
/* This works for real_cwd but not virt_cwd */
DIR *d = opendir(/* real_cwd | virt_cwd */);
以下是read_cwd
的代码:
char *read_cwd(char *cwd_buff)
{
FILE *f = fopen(X_PATH_FILE, "r");
fgets(cwd_buff, 80, f);
printf("Read cwd %s\n", cwd_buff);
fclose(f);
return cwd_buff;
}
答案 0 :(得分:3)
函数fgets
包含缓冲区中的最终换行符 - 因此第二个字符串实际上是"/Users/gwg/x\n"
。
解决此问题的最简单(但不一定是最干净的)方法是使用'\0'
覆盖换行符:在函数read_cwd
的末尾添加以下内容:
n = strlen(cwd_buff);
if(n > 0 && cwd_buff[n - 1] == '\n')
cwd_buff[n - 1] = '\0';
答案 1 :(得分:1)
fgets()
包含换行符。
如果文件结束或找到换行符,则解析停止,在这种情况下str将包含该换行符。 - http://en.cppreference.com/w/c/io/fgets
在读取这样的输入时,你应该修剪字符串两端的空白区域。
答案 2 :(得分:1)
来自fgets
手册页:
fgets()从流和中读取最多一个小于大小的字符 将它们存储到s指向的缓冲区中。读后停止了 EOF或换行符。 如果读取换行符,则会将其存储到缓冲区中。 终止空字节(aq \ 0aq)存储在最后一个字符之后 缓冲区。
您需要从正在阅读的字符串中删除换行符。