"Sams自己C"中的示例使用"fgets"但返回错误

God*_*629 -2 c c++ compilation fgets

包含的代码完全不在书中,但它会返回错误.这本书有不正确的做法吗?我以前从未使用#include <string.h>过,#include <stdio.h>但我仍然不知道三个参数应该是什么.

#include <stdio.h>
#include <string.h>
int main(void)
{
    char buffer[256];

    printf("Enter your name and press <Enter>:\n");
    fgets(buffer);

     printf("\nYour name has %d characters and spaces!",
         strlen(buffer));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译说

Semantic issue with (fgets( buffer ); - Too few arguments to function call, expected 3, have 1

Format string issue (strlen(buffer)); - Format specifies type 'int' but the argument has type 'unsigned long'
Run Code Online (Sandbox Code Playgroud)

lou*_*kwn 5

fgets的正确格式是:

char * fgets ( char * str, int num, FILE * stream );
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下它应该是这样的: fgets(buffer,sizeof(buffer),stdin);


Val*_*ier 5

fgets() 必须采取三个参数.

  1. 该字符串用于放置读取值
  2. 要在此字符串中写入的字节数.但如果你Enter key caracter被发现它会在此时停止.
  3. 流从哪里读取数据.

这里你只指定一个参数,所以这还不够.这是导致错误的原因.有一个simplified版本的fgets只读取用户输入的数据并调用它gets().

gets(buffer);
Run Code Online (Sandbox Code Playgroud)

但是这个函数是不安全的,因为如果用户输入的字节数多于缓冲区的大小,那么就会出现内存溢出.这就是你应该使用的原因fgets().

像这样:

fgets(buffer, sizeof buffer, stdin);
Run Code Online (Sandbox Code Playgroud)

请注意,我已经传递了值sizeof bufferstdin.sizeof buffer是为了确保我们不会出现内存溢出.stdin是与键盘对应的流.因此,我们从键盘上安全地读取数据,您将获得一个可用的代码.

请参阅此处的参考资料:http : //www.cplusplus.com/reference/cstdio/gets/ http://www.cplusplus.com/reference/cstdio/fgets/

如果您感兴趣,还有其他功能可以读取用户输入,例如scanf():http://www.cplusplus.com/reference/cstdio/scanf/?kw = scanf