当我按's'和'你'时,为什么我无法得到正确答案?

时间:2014-04-27 16:49:09

标签: c debugging

我正在编写一个简单的程序,用C中的第一个字母来判断这一天。我在调试时遇到了一些麻烦。感谢所有提前看到并回答问题的人。

#include<stdio.h>
int main(void)

{
//Sunday  Monday Tuesday Wednesday Thursday Friday Saturday 

char letter;
printf("Input the first letter.\n");
scanf("%c",&letter); 

switch(letter)
{
    case 's': printf("Please in put the second number:\n");
          if(getchar()=='u')
              printf("It's Sunday\n");
          else if(getchar()=='a')
              printf("It's Saturday\n");
          else 
              printf("Input wrong!\n");             
          break;
    case 'm': printf("It's Monday\n");
          break;
    case 't': printf("Please in put the second number\n");
          if(getchar()=='u')
              printf("It's Tuesday\n");
          else if(getchar()=='h')
              printf("It's Thursday\n");
          else 
              printf("Input wrong!\n");             
          break;
    case 'w':  printf("It's Wednesday.");
           break;
    case 'f':  printf("It's Friday.  "); 
           break;
    default : printf("You input the wrong letter \n");
}
return 0;
}

4 个答案:

答案 0 :(得分:5)

让我们看看你代码的一大块:

      if(getchar()=='u')
          printf("It's Sunday\n");
      else if(getchar()=='a')
          printf("It's Saturday\n");
      else 
          printf("Input wrong!\n");             
      break;

以下是该代码的执行方式:

  1. getchar()将被调用,我们会将其与'u'进行比较。让我们假设失败了。这意味着我们从输入键盘中​​消耗了一个字符。
  2. getchar()将再次被称为 ,并与'a'进行比较!
  3. 而不是这个,你可能想要这样的东西:

          int c = getchar();
          if(c == 'u')
              printf("It's Sunday\n");
          else if(c == 'a')
              printf("It's Saturday\n");
          else 
              printf("Input wrong!\n");             
          break;
    

    现在,您仍然会遇到其他问题,因为在scanf()之后,输入流中的下一个字符将是'\n'

    要解决此问题,请对输入的第一个和第二个字符使用scanf(" %c", &letter)

答案 1 :(得分:1)

请注意,stdin已缓存,并包含'\n'

printf("Input the first letter.\n");
scanf("%c", &letter); 

说用户正在考虑&#34;星期六&#34;。当用户输入 s Enter 时,scanf("%c",...)将消耗's''\n'将保留在stdin。< / p>

当代码到达

case 's': 
  printf("Please input the second letter:\n");
  if(getchar()=='u')
    printf("It's Sunday\n");

getchar()将返回'\n'

相反,读取输入并使用

抛出任何前面的空白区域
scanf(" %c",&letter); // Note leading space.

此外,正如其他人所指出的,在尝试区分星期六和星期日时,请勿再次阅读char

// Ensure letter has _some_ known value should scanf() reach EOF.
char letter = 0;
printf("Input the first letter.\n");
scanf(" %c", &letter); 

switch(letter) {
    case 's': 
      printf("Please input the second letter:\n");
      scanf(" %c", &letter); 
      if (letter == 'u')
        printf("It's Sunday\n");
      else if (letter == 'a')
        printf("It's Saturday\n");
      else 
        printf("Input wrong!\n");             
      break;

答案 2 :(得分:0)

您正在使用两次getchar()一个case语句。那不是你应该怎么做的。你应该首先使用getchar(),然后将其保存到变量中然后进行比较。这是要走的路。

答案 3 :(得分:-1)

例如,要到星期六,你需要输入s,然后输入summat而不是你的

与Tues和thurs相同

最有可能在终端,他们需要在程序查看之前按Enter键。所以只需读取一个字符串