说出这样的话:
#include <stdio.h>
void main() {
char fname[30];
char lname[30];
printf("Type first name:\n");
scanf("%s", fname);
printf("Type last name:\n");
scanf("%s", lname);
printf("Your name is: %s %s\n", fname, lname);
}
如果我为"asdas asdasdasd"
键入fname
,则不会要求我输入lname
的内容。我只是想问一下如何解决这个问题,谢谢。
答案 0 :(得分:5)
将%s
放入格式列表会使scanf()
读取字符,直到找到空格。您的输入字符串包含空格,因此第一个scanf()
仅读取asdas
。另外scanf()
被认为是危险的(想想如果输入超过30个字符会发生什么),这就是为什么如其他人所指出的那样你应该使用fgets()
。
以下是如何做到这一点:
#include <stdio.h>
#include <string.h>
int main()
{
char fname[30];
char lname[30];
printf("Type first name:\n");
fgets(fname, 30, stdin);
/* we should trim newline if there is one */
if (fname[strlen(fname) - 1] == '\n') {
fname[strlen(fname) - 1] = '\0';
}
printf("Type last name:\n");
fgets(lname, 20, stdin);
/* again: we should trim newline if there is one */
if (lname[strlen(lname) - 1] == '\n') {
lname[strlen(lname) - 1] = '\0';
}
printf("Your name is: %s %s\n", fname, lname);
return 0;
}
但是这段代码仍然不完整。您仍然应该检查fgets()
是否遇到了一些错误。详情阅读fgets()
here。
答案 1 :(得分:4)
使用fgets
(或getline
如果您使用的是GNU)获取整行,而不是直到第一个空格。
if (fgets(fname, 30, stdin) == NULL) {
// TODO: Read failed: handle this.
}
查看在线工作:ideone
您还可以考虑使用this answer中的fgets_wrapper
功能,因为它还会为您删除换行符。
答案 2 :(得分:1)
更改
scanf("%s", fname);
到
scanf("%[^\n]%*c", fname);
[^ \ n]接受“\ n”
以外的接受%* c忽略一个字符('\ n')