如何在C中输入带有scanf的两个字符串?我想按照以下方式使用它们:
#include <stdio.h>
#include <string.h>
main()
{
char kid[25];
char color[10];
scanf( "%24[^\n]", kid); // kid name
scanf( "%9[^\n]", color);
printf("%s\'s favorite color is %s.\n", kid, color);
return 0;
}
答案 0 :(得分:1)
您正在使用第一个\n
读取kid
到scanf()
的输入。但是scanf()
不会读取\n
并且它将保留在输入缓冲区中。
当完成下一个scanf()
时,它看到的第一个字符是\n
,在将任何内容写入color
之前,它会停止阅读。
你可以做到
scanf("%24[^\n] ", kid);
scanf("%9[^\n]", color);
[^\n]
之后的空格会读取\n
这样的空白字符。
如果使用%*c
,则
scanf("%24[^\n]%*c", kid);
%*c
中的 scanf()
会导致字符被读取,但不会被分配到任何地方。 *
是赋值抑制字符。请参阅here。
但如果在\n
之前输入的确只有25个字符作为输入,则%*c
将只读取最后一个字符,而\n
仍然在输入缓冲区中。
如果您可以使用scanf()
以外的功能,则fgets()
会很好。
待办事项
fgets(kid, sizeof(kid), stdin);
但请记住,fgets()
会将\n
读入kid
。您可以将其删除,如
kid[strlen(kid)-1]='\0';
由于正在读取此\n
,因此读取的数字字符实际上将减少1个。
答案 1 :(得分:0)
您的问题是此行不会从流中读取\n
字符。
scanf( "%24[^\n]", kid); // kid name
因此,您阅读了孩子的名字,但不要删除换行符。因此,下一个scanf()
只会看到输入流上的返回字符,因此您将获得一个空白颜色。
if (scanf( "%24[^\n]", kid) == 1) { // kid name
char term;
while ( scanf( "%c", &term) == 1 && term != '\n') {
/* read characters until you can't read or you reach the end of line */
}
}
else {
/* Error */
}
如果用户输入的孩子姓名超过24个字符,则需要阅读并丢弃这些字符(或进行一些适当的错误处理)。孩子名称的末尾用'\n'
字符标记。
注意:上面的while循环用于说明目的。有更好的方法。
if (scanf( "%24[^\n]", kid) == 1) { // kid name
scanf("%*[^\n]"); // Note. You can not use "%*[^\n]\n". This will fail if just a newline
scanf("\n"); // So split into two lines (the first may read nothing).
}
else {
/* Error */
}