为什么opendir()适用于一个字符串而不适用于另一个字符串?

时间:2015-01-05 00:24:27

标签: c stdin

我想使用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;
}

3 个答案:

答案 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)存储在最后一个字符之后   缓冲区。

您需要从正在阅读的字符串中删除换行符。