鱼C论坛

 找回密码
 立即注册
查看: 1371|回复: 5

[已解决]求解,if语句的b为什么不能赋值。

[复制链接]
发表于 2023-8-8 18:28:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续
   判断第二个字母。
求解,if语句的b为什么不能赋值。
#include<stdio.h>

void main()
{
   char a,b;
   int i;
  while(1)
   {
            printf("Enter the first:");
        scanf("%c",&a);
                if(a!='T')
                {
                        break;
                }
                else if(a=='T')
                {
                 printf("Enter the second one:");
         scanf("%c",&b);
                 break;
                }
                else if(a=='S')
                {
                 printf("Enter the second one:");
         scanf("%c",&b);
                 break;
                }
   }
   switch(a)
   {
   case 'S':
           switch(b)
           {
           case 'a':printf("Today is Saturday!\n");break;
           case 'u':printf("Today is Sunday!\n");break;
           }
    case 'T':
           switch(b)
           {
           case 'u':printf("Today is Tuesday!\n");break;
           case 'h':printf("Today is Thursday!\n");break;
           }
        case 'M':printf("Today is Monday!\n");break;
        case 'W':printf("Today is Wendnesday!\n");break;
        case 'F':printf("Today is Friday!\n");break;
   }
}
   [/code]
最佳答案
2023-8-8 18:29:06
问题解答:

这段代码中的问题出在对变量 b 的输入处。尽管 b 被定义为 char 类型,本质上是可以被赋值的。然而,在接受用户输入时,使用了 scanf("%c", &b) 来获取字符,这可能导致意外的结果。

问题出现在输入回车键后,scanf 函数会将回车符(\n)作为下一个字符并将其放入 b 中。因此,当输入星期几的第一个字母后按下回车键,b 实际上会被赋值为 \n,而不是用户输入的第二个字母。这会导致程序不能正确判断星期几。

解决这个问题的一种方法是在 scanf 函数之前添加一个额外的 getchar(),用于吸收输入缓冲区中的回车符。修改后的代码如下:
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     char a, b;
  5.    
  6.     while (1)
  7.     {
  8.         printf("Enter the first: ");
  9.         scanf(" %c", &a);
  10.         
  11.         if (a != 'T')
  12.         {
  13.             break;
  14.         }
  15.         else if (a == 'T')
  16.         {
  17.             printf("Enter the second one: ");
  18.             getchar();  // 吸收回车符
  19.             scanf("%c", &b);
  20.             break;
  21.         }
  22.         else if (a == 'S')
  23.         {
  24.             printf("Enter the second one: ");
  25.             getchar();  // 吸收回车符
  26.             scanf("%c", &b);
  27.             break;
  28.         }
  29.     }
  30.    
  31.     switch (a)
  32.     {
  33.         case 'S':
  34.             switch (b)
  35.             {
  36.                 case 'a': printf("Today is Saturday!\n"); break;
  37.                 case 'u': printf("Today is Sunday!\n"); break;
  38.             }
  39.             break;
  40.         case 'T':
  41.             switch (b)
  42.             {
  43.                 case 'u': printf("Today is Tuesday!\n"); break;
  44.                 case 'h': printf("Today is Thursday!\n"); break;
  45.             }
  46.             break;
  47.         case 'M': printf("Today is Monday!\n"); break;
  48.         case 'W': printf("Today is Wednesday!\n"); break;
  49.         case 'F': printf("Today is Friday!\n"); break;
  50.     }
  51.    
  52.     return 0;
  53. }
复制代码

在修改后的代码中,使用了 getchar() 来吸收输入缓冲区中的回车符,这样就可以确保 scanf 函数正确读取用户输入的第二个字母。

希望这个解答对你有帮助!如果你有任何其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-8 18:28:52 | 显示全部楼层
在你提供的代码中,变量b可以被赋值。然而,在读取第一个字母后,尝试读取第二个字母时可能会出现问题。这是因为scanf函数在读取字符后会留下一个换行符('\n')在输入缓冲区中。这导致下一个scanf语句会立即读取该换行符,而不等待你的输入。

解决这个问题的一种方法是在读取第一个字母之后,使用一个额外的scanf语句来清除输入缓冲区中的换行符。你可以在读取第一个字母后添加以下代码来清除换行符:
  1. scanf("%c", &b); // 清除换行符
复制代码


或者,在读取第一个字母和第二个字母之间,添加一个额外的空格字符的scanf语句,如下所示:
  1. scanf(" %c", &b); // 添加空格字符来吸收换行符
复制代码


这样,你就可以顺利读取第二个字母了。

值得注意的是,将变量b的值赋给if语句中的条件判断并不会导致任何问题。事实上,你的代码中已经在if语句中对变量b进行了比较,没有问题。

希望能解答你的疑问!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-8 18:29:02 | 显示全部楼层
问题出在scanf语句中的%c格式符。当输入第一个字母时,输入的字符会被赋值给变量a。但是,当输入第二个字母时,由于上一次输入的回车符(\n)仍然在输入缓冲区中,scanf会将回车符作为输入的字符赋值给变量b,而不会等待用户输入第二个字母。

解决这个问题的方法是在%c前加一个空格,即将scanf("%c",&b);改为scanf(" %c",&b);。这样可以忽略输入缓冲区中的回车符,确保能够正确读取用户输入的第二个字母。修改后的代码如下:

  1. #include<stdio.h>

  2. void main()
  3. {
  4.     char a,b;
  5.     int i;
  6.     while(1)
  7.     {
  8.         printf("Enter the first:");
  9.         scanf(" %c",&a); // 在%c前加一个空格
  10.         if(a!='T')
  11.         {
  12.             break;
  13.         }
  14.         else if(a=='T')
  15.         {
  16.             printf("Enter the second one:");
  17.             scanf(" %c",&b); // 在%c前加一个空格
  18.             break;
  19.         }
  20.         else if(a=='S')
  21.         {
  22.             printf("Enter the second one:");
  23.             scanf(" %c",&b); // 在%c前加一个空格
  24.             break;
  25.         }
  26.     }
  27.     switch(a)
  28.     {
  29.         case 'S':
  30.             switch(b)
  31.             {
  32.                 case 'a':printf("Today is Saturday!\n");break;
  33.                 case 'u':printf("Today is Sunday!\n");break;
  34.             }
  35.         case 'T':
  36.             switch(b)
  37.             {
  38.                 case 'u':printf("Today is Tuesday!\n");break;
  39.                 case 'h':printf("Today is Thursday!\n");break;
  40.             }
  41.         case 'M':printf("Today is Monday!\n");break;
  42.         case 'W':printf("Today is Wendnesday!\n");break;
  43.         case 'F':printf("Today is Friday!\n");break;
  44.     }
  45. }
复制代码


这样修改后,就可以正确读取用户输入的第二个字母,并根据输入的字母判断是星期几了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-8 18:29:06 | 显示全部楼层    本楼为最佳答案   
问题解答:

这段代码中的问题出在对变量 b 的输入处。尽管 b 被定义为 char 类型,本质上是可以被赋值的。然而,在接受用户输入时,使用了 scanf("%c", &b) 来获取字符,这可能导致意外的结果。

问题出现在输入回车键后,scanf 函数会将回车符(\n)作为下一个字符并将其放入 b 中。因此,当输入星期几的第一个字母后按下回车键,b 实际上会被赋值为 \n,而不是用户输入的第二个字母。这会导致程序不能正确判断星期几。

解决这个问题的一种方法是在 scanf 函数之前添加一个额外的 getchar(),用于吸收输入缓冲区中的回车符。修改后的代码如下:
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     char a, b;
  5.    
  6.     while (1)
  7.     {
  8.         printf("Enter the first: ");
  9.         scanf(" %c", &a);
  10.         
  11.         if (a != 'T')
  12.         {
  13.             break;
  14.         }
  15.         else if (a == 'T')
  16.         {
  17.             printf("Enter the second one: ");
  18.             getchar();  // 吸收回车符
  19.             scanf("%c", &b);
  20.             break;
  21.         }
  22.         else if (a == 'S')
  23.         {
  24.             printf("Enter the second one: ");
  25.             getchar();  // 吸收回车符
  26.             scanf("%c", &b);
  27.             break;
  28.         }
  29.     }
  30.    
  31.     switch (a)
  32.     {
  33.         case 'S':
  34.             switch (b)
  35.             {
  36.                 case 'a': printf("Today is Saturday!\n"); break;
  37.                 case 'u': printf("Today is Sunday!\n"); break;
  38.             }
  39.             break;
  40.         case 'T':
  41.             switch (b)
  42.             {
  43.                 case 'u': printf("Today is Tuesday!\n"); break;
  44.                 case 'h': printf("Today is Thursday!\n"); break;
  45.             }
  46.             break;
  47.         case 'M': printf("Today is Monday!\n"); break;
  48.         case 'W': printf("Today is Wednesday!\n"); break;
  49.         case 'F': printf("Today is Friday!\n"); break;
  50.     }
  51.    
  52.     return 0;
  53. }
复制代码

在修改后的代码中,使用了 getchar() 来吸收输入缓冲区中的回车符,这样就可以确保 scanf 函数正确读取用户输入的第二个字母。

希望这个解答对你有帮助!如果你有任何其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-8 18:33:49 | 显示全部楼层
感谢各位大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-8 18:42:14 | 显示全部楼层
感谢大佬,已改正完成。
  1. #include<stdio.h>

  2. void main()
  3. {
  4.    char a,b;
  5.    printf("Enter the first:");
  6.    scanf("%c",&a);
  7.    switch(a)
  8.    {
  9.     case 'S':
  10.                 printf("Enter the second one:");
  11.                 scanf(" %c",&b);
  12.             switch(b)
  13.                 {
  14.             case 'a':printf("Today is Saturday!\n");break;
  15.             case 'u':printf("Today is Sunday!\n");break;
  16.                 }
  17.             break;
  18.     case 'T':
  19.                 printf("Enter the second one:");
  20.                 scanf(" %c",&b);
  21.             switch(b)
  22.                 {
  23.             case 'u':printf("Today is Tuesday!\n");break;
  24.             case 'h':printf("Today is Thursday!\n");break;
  25.                 }
  26.             break;
  27.         case 'M':printf("Today is Monday!\n");break;
  28.         case 'W':printf("Today is Wendnesday!\n");break;
  29.         case 'F':printf("Today is Friday!\n");break;
  30.    }
  31. }
  32.    
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 20:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表