【问题标题】:The conditions is not executing correctly [duplicate]条件未正确执行[重复]
【发布时间】:2018-03-12 14:28:59
【问题描述】:

对于age >= 25 和未婚女性,输出不正确。

/* 如果满足以下任一条件,公司会为其司机投保 满意 司机结婚了。 司机为未婚男性,30岁以上。 司机未婚,女性,25岁以上。 编写一个程序来决定是否使用逻辑运算符为驾驶员投保。 */

#include <stdio.h>

int main()
{
  char name[100]; 
  char ms, gender;
  int age;

  printf("\n\tNAME: ");
  scanf("%[^\n]%*c", name);

  printf("\n\tAGE: ");
  scanf("%d", &age);

  printf("\n\tMARRIED [Y/N]: ");
  scanf("%s",&ms);

  printf("\n\tGENDER [M/F]: ");
  scanf("%s",&gender);

  if(ms == 'Y'|| ms == 'y')//married
      printf("\n\t1. INSURED\n");

  else//unmarried
  {
      if(gender == 'M' || gender == 'm')//male
      {
          if(age >= 30)
              printf("\n\t2. INSURED\n");
          else
              printf("\n\t3. NOT INSURED\n");
      }
      else//female
      {
          if(age >= 25)
              printf("\n\t4. INSURED\n");     
          else
              printf("\n\t5. NOT INSURED\n");  
      }
  }
  return 0;
}

请帮我找出错误。为了找到错误,我已经对输出进行了编号以了解。错在哪里。但我找不到任何东西。 输出:

NAME: 

AGE: 26

MARRIED [Y/N]: n

GENDER [M/F]: f

5. NOT INSURED

【问题讨论】:

  • Fix-my-code 请求是题外话。编译所有警告和调试信息(gcc -Wall -Wextra -gGCC....)。 使用调试器 gdb(逐步运行程序并查询其状态)和valgrind。当心undefined behavior。阅读documentation
  • @BasileStarynkevitch 对不起!我不确定您所说的“gcc -Wall -Wextra -g”是什么意思。
  • GCC 是一种免费的软件编译器(也是 Linux 发行版中常用的编译器)。我推荐使用它(如果你正在学习 C 编程,我还推荐安装和使用一些 Linux 发行版)。您应该花几天时间阅读编译器和调试器的文档。
  • 我知道。但是,什么是 gdb,我该如何使用它。
  • @rgo - 你听说过谷歌吗?它非常擅长回答琐碎的问题......

标签: c


【解决方案1】:

您的变量 msgender 是单个字符,而不是存储字符串的字符数组。

您正在使用%s 格式说明符读取ms。 使用%c 格式说明符代替用于读取char 的格式说明符。

喜欢

scanf(" %c",&ms);

而不是

scanf("%s",&ms);

%c 之前的空格用于忽略输入缓冲区中可能保留的空格,这些空格可能会被读入ms 而不是真正的输入。

【讨论】:

  • 顺便说一句,任何启用了所有警告的好的编译器都会检测到这个错误,因此我对gcc -Wall -Wextra -g的建议
  • @BasileStarynkevitch 我按照你说的编译了:gcc -Wall -Wextra -g [filename].c 我没有收到任何错误信息。
  • 好的。但是你用过gdb 吗?
  • @rgo 不要用%s 编译。对msgender 都使用`%c`。注意%c之前的空格。
  • @rgo 读入age 后,按回车键输入\n 或一些空格,对吗?这不会被scanf() 读取age 消耗,并将保留在输入缓冲区中。这将被下一个scanf() 读取并看到\n 它认为ms 的输入已经结束并转到下一行。
【解决方案2】:

您将msgender 声明为char variable,并使用char array 的格式说明符。

因此,您将scanf 语句替换为下面为msgender 输入的任何语句。

 1. scanf("\n%c",&ms);

 2. scanf("\t%c",&ms);

 3. scanf("\r%c",&ms);

 4. scanf(" %c",&ms);

同样替换scanf 的性别声明。

【讨论】:

  • 请注意,每个类似空格的字符 \n \t \r 和空格 ' ' 本身对于 scanf 控制字符串的行为相同;所以总是使用空格使恕我直言代码更具可读性