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

时间:2014-07-25 01:19:38

标签: 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;
}

编译器说

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'

3 个答案:

答案 0 :(得分:5)

fgets的正确格式为:

char * fgets ( char * str, int num, FILE * stream );

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

答案 1 :(得分:5)

fgets()必须采用三个参数。

  1. 该字符串用于放置读取值
  2. 此字符串中要写入的字节数。但如果您发现了 Enter key caracter ,它将会在此时停止。
  3. 从哪里读取数据的流。
  4. 这里你只指定一个参数,所以这还不够。这是导致错误的原因。有一个 simplified 版本的fgets只读取用户输入的数据,称为gets()

    gets(buffer);
    

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

    的原因

    像这样:

    fgets(buffer, sizeof buffer, stdin);
    

    请注意,我已传递了值sizeof bufferstdinsizeof 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

答案 2 :(得分:2)

您是否阅读过关于fgets的文档?

http://www.cplusplus.com/reference/cstdio/fgets/

还有一个适当使用的例子。

这是过时的代码,因为不推荐使用gets(),但为了让你的示例正常工作,你可以这样做:

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

    printf("Enter your name and press <Enter>:");
    gets(buffer);

    printf("\nYour name has %d characters and spaces!\n", (int)strlen(buffer));

    return 0;
}

玩得开心!