#include <stdio.h>
int main()
{
char name[20];
printf("Enter name: ");
scanf("%s", name);
printf("Your name is %s.", name);
return 0;
}
输出:
输入姓名:Dennis Ritchie 你的名字是丹尼斯。
到目前为止,我还没有找到任何具体的理由来解决这个问题。任何人都可以帮助我吗?
答案 0 :(得分:2)
scanf
只有在第一个空格之后才能读到空间,这就是为什么它没有存储,所以你的printf
函数没有错误,scanf
不是存储完整的字符串,在遇到第一个空格时停止。
除非他们完全知道他们在做什么,否则永远不应该使用gets()
,因为它没有缓冲区溢出保护,它会在缓冲区结束后继续读取,直到找到新行或遇到EOF。您可以详细了解here。请查看Why is the gets function so dangerous that it should not be used?
您应该使用fgets()
。
#include <stdio.h>
int main(){
char name[20];
printf("Enter name: ");
fgets(name,20,stdin);
printf("Your name is %s.", name);
return 0;
}
记住fgets()
也会读取换行符(按Enter键时得到的那个),所以你应该手动删除它。
另外,我强烈推荐这个answer来充分利用fgets()并避免常见的陷阱。
这个answer讲述了使用scanf读取字符串。它说的是:
int main(){
char string[100], c;
int i;
printf("Enter the string: ");
scanf("%s", string);
i = strlen(string); // length of user input till first space
do{
scanf("%c", &c);
string[i++] = c; // reading characters after first space (including it)
}while (c != '\n'); // until user hits Enter
string[i - 1] = 0; // string terminating
return 0;
}
这是如何运作的?当用户从标准输入中输入字符时,它们将存储在字符串变量中,直到第一个空格。之后,其余的条目将保留在输入流中,并等待下一个scanf。接下来,我们有一个for循环,它从输入流中获取char(直到
\n
)并将它们附加到字符串变量的结尾,从而形成一个与键盘用户输入相同的完整字符串。