我刚刚开始学习C.以下是我正在尝试的一些示例代码。它只是为了获得用户名。如果我为期望char的第一个答案输入一个字符串,则第一个字母将保存到middleInitial,但是后续scanf会读取并保存被忽略的其余字符串。这意味着输入“Jacob”然后输入“Pat Smith”将导致输出“你的名字是acob J Pat”为什么会这样?
char middleInitial;
printf("What is your middle initial?");
scanf(" %c", &middleInitial);
char firstName[30], lastName[30];
printf("What is your name? ");
scanf(" %s %s", firstName, lastName);
printf("Your name is %s %c %s", firstName, middleInitial, lastName);
答案 0 :(得分:0)
原因是第一个scanf
未提取的其余字符停留在STDIN
缓冲区中,然后被后续scanf
所取代。在您阅读flush
和firstname
之前,lastname
STDIN。
由于fflush
不是在STDIN缓冲区中删除不需要的字符的可靠方法,因此解释了here的手动方式。
答案 1 :(得分:0)
根据代码:
scanf(" %c", &middleInitial);
middleInitial获取您输入的唯一第一个字符。
例如:你输入了“雅各布”,然后是“约翰史密斯”:
middleInitial = J
firstName = acob
lastName = John
你应该尝试:
char middleInitial;
char str[30];
printf("What is your middle name?");
scanf(" %c", &middleInitial); // get "J"
scanf(" %s", &str); // get "acob"
char firstName[30], lastName[30];
printf("What is your name? ");
scanf(" %s %s", firstName, lastName);
printf("Your name is %s %c %s", firstName, middleInitial, lastName);
答案 2 :(得分:0)
我对C中的字符串(char *)用法有一些建议。 首先,正如sumithdev所说,在输入任何信息之前,使用fflush(stdin)清理输入流缓冲区。 其次,尝试使用统一样式存储所有字符串数据。例如,你的middleInitial也可以定义为char数组但是长度为2(middleInitial [0]将是一个字符,middleInitial [1]将是'\ 0')。 最后的建议 - 尝试使用强大的功能来防止内存冲突和数据丢失。 代码:
scanf(" %s %s", firstName, lastName);
我发现了潜在的问题:
a)一般来说,用户的名字或姓氏可以是多个单词,但是scanf中的一个%s读取字符直到空格;
b)名字或姓氏可能大于29个字母,30个数组元素不足以存储输入,这将导致运行时问题;c)当您想要更改输入名称的不同部分的顺序或添加一些检查时,您的代码中将进行大量的硬修改。
考虑以下版本:
char middleInitial[2];
char firstName[30], lastName[30];
// asking for middle part
printf("What is your middle initial? ");
fflush(stdin); // delet all previous inputs
scanf("%1s", middleInitial); // wait new inputs and take only 1 character
// asking for first part
printf("What is your first name? ");
fflush(stdin);
scanf("%29s", firstName); // wait new inputs and take not more than 29 characters
// asking for last part
printf("What is your last name? ");
fflush(stdin);
scanf("%29s", lastName); // wait new inputs and take up to 29 characters
// output result
printf("Your name is %s %s %s\n", firstName, middleInitial, lastName);
并且还尝试使用fgets而不是scanf。例如:
fflush(stdin);
fgets(firstName, 30, stdin); // this allows input of strings with spaces
// but adds 'new line' (\n) in the end of string