包含的代码完全不在书中,但它会返回错误。这本书有不正确的做法吗?我之前从未使用过#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'
答案 0 :(得分:5)
fgets的正确格式为:
char * fgets ( char * str, int num, FILE * stream );
所以在你的情况下它应该是这样的:
fgets(buffer,sizeof(buffer),stdin);
答案 1 :(得分:5)
fgets()
必须采用三个参数。
Enter key caracter
,它将会在此时停止。这里你只指定一个参数,所以这还不够。这是导致错误的原因。有一个 simplified
版本的fgets只读取用户输入的数据,称为gets()
。
gets(buffer);
但是这个函数是不安全的,因为如果用户输入的字节数多于缓冲区的大小,那么就会有内存溢出。这就是你应该使用fgets()
。
像这样:
fgets(buffer, sizeof buffer, stdin);
请注意,我已传递了值sizeof buffer
和stdin
。 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
答案 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;
}
玩得开心!