我目前在使用fgets()替换gets()时遇到问题。我已经看过这样做的多个例子,看起来很直接,但是这样做会得到意想不到的输出。在下面的注释中使用gets()方法,我从我编写的shell程序中得到了良好的行为,但是当我改为fgets()调用时,我得到输出":没有这样的文件或目录"在给予输入" ls"。就像我说的,使用gets()调用它工作正常。代码如下:
int main(void) {
while(1) {
int i = 0;
printf("$shell: ");
scanf("%s", first);
/* gets(input);*/
fgets(input, sizeof(input), stdin);
//...parse input into tokens for exec system call...
execvp(first, args);
}
return 0;
}
答案 0 :(得分:2)
与gets
不同,fgets
会读取换行符并将其存储在字符串中。
从手册页:
fgets()
从流中读取最多一个小于大小的字符 并将它们存储到s指向的缓冲区中。阅读停止 在EOF
或换行符之后。 如果读取换行符,则将其存储到 缓冲区。'\0'
存储在最后一个字符之后 缓冲液中。
您可以删除换行符(如果存在),将其替换为空字节:
fgets(input, sizeof(input), stdin);
if (input[strlen(input)-1] == '\n') input[strlen(input)-1] = '\0';