我的代码如下所示:
int nameFull;
printf("What is your name?\n");
scanf("%d\n", &nameFull); \\up until here it seems to work
printf("Hello %d", nameFull);
return 0;
但是每次运行程序时我的输出都是" Hello 0"无论我输入什么。
有谁知道如何解决这个问题?
答案 0 :(得分:2)
首先scanf()
不会发出提示,所以在这里使用格式字符串中的任何尾随空格字符不是一个好主意,如\n
这样,它会导致它读取并丢弃字符直到下一个非空白字符。
要阅读名称,您可以这样做:
char name[50];
scanf("%49s",name); // 49 to limit the buffer input to prevent buffer overrun , this is a security issue.
您还应检查scanf
的返回值,以查看操作是否成功。就个人而言,由于各种潜在的问题,我不喜欢使用scanf()
。它仅作为程序作者期望的输入,而不考虑用户可能意外输入的其他输入。查看here和here。另请查看scanf() man page
更好更安全的方法是使用fgets(),
fgets(name,sizeof(name),stdin);
答案 1 :(得分:1)
%s
读取一串字符。
%d
读取整数。
因此,您的正确代码将类似于以下代码:
#include <stdio.h>
int main(){
char nameFull[100];
printf("What is your name?\n");
scanf("%99s", nameFull); //to avoid potential buffer overflow
printf("Hello %s\n", nameFull);
return 0;
}
N.B:检查此comment以获得更好的解释。
答案 2 :(得分:1)
您想要读取字符串,但是您是一个存储输入的整数。这不是正确的方法。
更好的方法是使用一个字符数组,将字符串存储在其中。
char nameFull[100]; // can store up to 100 characters, 99 + 1 for the null-terminator ideally
现在,您可以使用scanf,如下所示:
scanf(" %99[^\n]", nameFull);
请注意,如果用户为数组的大小输入了太多字符,我使用99
作为保护,不会使数组nameFull
溢出。我没有使用%s
,它会停留在空白处,而你似乎想要输入一个全名,通常是两个单词,中间是空格。
另一种方法是使用fgets()
,这样可以提供更多安全性,如下所示:
fgets(nameFull, sizeof(nameFull), stdin)
它将读取整行并存储尾随换行符,而scanf()
将读取单个字符串。
此外,使用字符串标识符进行打印,而不是整数(%s
表示字符串,%d
表示整数)。像这样:
printf("Hello %d", nameFull);
到此:
printf("Hello %s", nameFull);
讨论了字符串格式。
答案 3 :(得分:-1)
好吧,int存储一个数字,一个名字不是一个数字。名称是一组字符(又名字符串)。所以这个程序可以工作(没有错误检查,因为你在介绍性课程中):
char name[1024]; // 1024 is more than enough space for a name
scanf("%s", name); // %s reads a string of characters
printf("Hello %s\n", name);
return 0;
答案 4 :(得分:-1)
您正尝试将字符数组(通常称为 string )分配给整数变量。
这不正确。
只需更改您的变量
char nameFull[1024] = {0};
然后将scanf(3)
与字符串的相应格式说明符一起使用,即%s
scanf("%s", nameFull);
通常你会检查scanf的返回以了解是否发生错误,在这种情况下,处理它们。
无论如何,我建议你使用fgets(3)
来防止缓冲区溢出
char *fgets(char *s, int size, FILE *stream);
fgets()从流中读取最多一个小于大小的字符,并将它们存储到s指向的缓冲区中。读数在EOF或换行符后停止。如果读取换行符,则将其存储到缓冲区中。终止空字节(aq \ 0aq)存储在缓冲区中的最后一个字符之后。