c - scanf没有正确存储输入

时间:2017-09-24 05:23:49

标签: c string io

我的代码如下所示:

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"无论我输入什么。

有谁知道如何解决这个问题?

5 个答案:

答案 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()。它仅作为程序作者期望的输入,而不考虑用户可能意外输入的其他输入。查看herehere。另请查看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)存储在缓冲区中的最后一个字符之后。