使用scanf函数输入两个字符串

时间:2017-10-30 16:05:23

标签: c string scanf

如何在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;
}

2 个答案:

答案 0 :(得分:1)

您正在使用第一个\n读取kidscanf()的输入。但是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 */
}