0

我刚开始使用 C。在我的程序中,用户输入一个文件名,然后我检查该文件是否存在。

这是到目前为止的代码:

    printf("Enter the file name:\n");
    char filename[50];
    fgets(filename, 50, stdin);
    printf("You have entered %s\n", filename);
    if( access(filename, F_OK ) == -1 )
    {
        printf("File not found/access denied.\n");
    }

在与程序本身相同的目录中,我得到了一个名为“steps”的文件。但是,每当我输入步骤或 ./steps 甚至 ~/steps 时,我都会收到未找到文件的错误消息。

这里有什么问题?

顺便说一句,我在 Linux (Ubuntu) 上。此外,我确定我可以访问该文件 - 所以这不是权限问题。

4

2 回答 2

1

fgets在缓冲区中包含尾随的换行符,因此access认为这是文件名的一部分。您需要剥离新线。

在 fgets 之后,添加以下行:

if (filename[strlen(filename)-1] == '\n') filename[strlen(filename)-1] = '\0';

把它剥掉。

编辑:正如@a​​lk 指出的(谢谢),这应该是:

if (strlen(filename) > 0 && filename[strlen(filename)-1] == '\n')
    filename[strlen(filename)-1] = '\0';

&&如果左侧评估为,则不会评估右侧,false因此没有机会超出数组边界。

于 2013-09-28T16:55:42.403 回答
1

因为在空字符之前 fgets()添加。\n

例如,如果您输入“abcd”,这将变为“abcd\n”

读取文件名后,只需替换\n为空字符

 fgets(filename, 50, stdin); 

 if(filename[strlen(filename)-1]=='\n')
    filename[strlen(filename)-1]='\0';
于 2013-09-28T16:56:59.013 回答