C:错误用fgets()替换gets()

时间:2016-02-29 03:05:25

标签: c fgets

我目前在使用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;
}

1 个答案:

答案 0 :(得分:2)

gets不同,fgets会读取换行符并将其存储在字符串中。

从手册页:

  

fgets()从流中读取最多一个小于大小的字符   并将它们存储到s指向的缓冲区中。阅读停止   在EOF或换行符之后。 如果读取换行符,则将其存储到   缓冲区。 '\0'存储在最后一个字符之后   缓冲液中。

您可以删除换行符(如果存在),将其替换为空字节:

fgets(input, sizeof(input), stdin);
if (input[strlen(input)-1] == '\n') input[strlen(input)-1] = '\0';