【发布时间】:2013-11-01 15:07:03
【问题描述】:
这快把我逼疯了。我编写了一个程序,它接受用户输入的文件名。它在我的 ~/documents/cs 目录中执行时按预期运行,但在我的 ~/documents/cs/assign5 目录中失败。这对我来说完全没有意义。为什么程序的行为会根据它所在的目录而有所不同?
在父目录中执行的良好输出:
./a.out - file2
Enter the filename: file1
FILE1
FILE2
assign5 目录的错误输出:
./a.out - file2
Enter the filename: file1
file1
n: No such file or directory
我什至尝试将 assign5 目录重命名为其他目录,效果很好。
该程序基本上采用两个命令行参数。如果存在“-”命令行参数,它会询问文件名。然后它将两个文件的内容打印到标准输出。这是程序失败的地方(仅在assign5目录中......)。似乎当程序在assign5目录中运行时,userInput变量存储的值是“n”而不是“file1”。为什么!?
if(strcmp(argv[1], "-") == 0) // use standard-in for input file 1
{
printf("Enter the filename: ");
fflush(NULL);
read(STDIN_FILENO, userInput, sizeof(userInput));
userInput[strlen(userInput)-1] = '\0';
if((input_file1 = open(userInput, O_RDONLY)) < 0)
{
perror(userInput);
exit(1);
}
更新:
我在名为“assign5”的目录中的远程 linux 服务器上运行完全相同的代码,并按预期编译和执行。那么,我的电脑有什么问题吗?
【问题讨论】:
-
那个代码充满了危险。我会避免在这个应用程序中使用 read()。
-
如果你使用 read,它会返回一个值。使用它。
-
strlen() 再次。几乎所有与该调用一起发布的代码都将空终止符问题作为问题的根本原因。
-
从
userInput[strlen(userInput)-1];函数中删除-1,请参阅下面的答案以获得解释。