【问题标题】:scanf("%c") call seems to be skippedscanf("%c") 调用似乎被跳过
【发布时间】:2021-11-13 06:27:38
【问题描述】:

我在下面尝试了这段代码,但似乎跳过了scanf("%c")。它只要求我输入姓名和年龄,并跳过下面的行。它只是在if 语句上方的printf 中打印文本。有人可以帮忙吗?

#include<stdio.h>

int main()
{
    int age;
    char sex;
    char name[20];
    char status;
    printf("Enter your last name\n");
    scanf("%s", &name);

    printf("Enter your age\n");
    scanf("%d", &age);

    printf("Enter sex (M/F)\n");
    scanf("%c", &sex);

    printf("your status,married, single,irrelevant (M/S/I)\n");
    scanf("%c", &status);
    if(age>=16 && sex=='M')
        printf("hello, Mr %s\n", name);
    if(age<16 && sex =='M')
        printf("hello, Master %s\n", name);
    if(sex=='F' && status=='M')
        printf("hello, Mrs %s\n", name);
    if(sex=='F' &&(status=='S' ||status=='I'))
        printf("hello,miss %s\n", name);
}

【问题讨论】:

标签: c scanf


【解决方案1】:

发生这种情况是因为空格也被视为一个字符,并且在您按 Enter 时发生。 所以留个空间。

scanf(" %c",&something);

【讨论】:

    【解决方案2】:

    除非您对换行符之类的空格感兴趣,否则不要使用%c。只需使用字符串转换%s 并使用输入的第一个字符。

    基本原理:除%c 之外的所有scanf 转换说明符都忽略包括换行符在内的空格。它们旨在读取与空白的数量和性质无关的输入标记(数字、单词)序列。单词可以都在同一行,也可以每个单词在不同的行; scanf 不会在意,除非您使用 %c 强制读取单个字符,这几乎没有必要。

    【讨论】:

      【解决方案3】:

      把你的代码改成

      #include<stdio.h>
      int  main()
      {
      int age;
      char sex;
      char name[20];
      char status;
      printf("Enter your last name\n");
      // scanf("%s", &name);
      fgets(name,20,stdin);
      
      printf("Enter your age\n");
      scanf("%d", &age);
      
      printf("Enter sex (M/F)\n");
      scanf(" %c", &sex);
      
      
      printf("your status,married, single,irrelevant (M/S/I)\n");
      scanf(" %c", &status);
      if(age>=16 && sex=='M')
      printf("hello, Mr %s\n", name);
      if(age<16 && sex =='M')
      printf("hello, Master %s\n", name);
      if(sex=='F' && status=='M')
      printf("hello, Mrs %s\n", name);
      if(sex=='F' &&(status=='S' ||status=='I'))
      printf("hello,miss %s\n", name);
      return 0;
      }
      

      在这里,我在格式说明符 %c 之前添加了一个额外的空格,以容纳任何先前的输入,例如换行符 (\n)。
      另一种替代方法是在输入任何字符之前立即使用getchar()

      另外,如果您使用scanf 执行字符串输入,遇到空格后将不会读取输入。因此,请改用fgets 来获取任何可能包含空格的字符串输入。

      我在您的代码中更改的另一件事(微不足道)是 int main()return 0

      【讨论】:

        【解决方案4】:

        改变

        scanf("%c", &sex);
        

        scanf(" %c", &sex);
               ^
              space
        

        scanf("%c", &status);
        

        scanf(" %c", &status);
               ^
              space
        

        问题是因为在您第二次调用scanf() 之后出现了换行符。由于它是 %d 类型说明符,当您按 Enter 时,流中会留下一个换行符('\n'),下一个 scanf() 会尝试读取该换行符,因此,看起来好像只是跳过了输入,但实际上,它读取了换行符。

        因此,换行符存储在变量sex 中,因此它会跳过询问您对该变量的输入。

        【讨论】:

          【解决方案5】:

          您可以对所有scanfs 执行以下操作。

          scanf("%c\n",&smth);
          

          然后逐个输入值,用换行符分隔它们(按Enter)。

          当我遇到同样的问题时,这对我也有帮助。

          scanf("%c*",&smth);
          

          这使得scanf 跳过用户可能输入的任何其他字符,包括换行符。


          注意:为每种类型使用适当的格式字符串(%s 用于字符串,%d 用于整数等)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-06-11
            • 2012-05-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-07
            相关资源
            最近更新 更多