【问题标题】:Issue in taking character input to C program将字符输入到 C 程序中的问题
【发布时间】:2014-11-28 13:35:31
【问题描述】:

我正在尝试运行一个程序,当用户输入 MFN 时检查用户输入的字符。它将检查和比较 char 字符。但是当我运行程序时。它不起作用。我和我的朋友尝试了很多方法,但我们无法解决这个问题。程序无法验证用户输入的数据。请帮忙。

typedef struct {
    char onePatient.gender;
}PATIENT_T

PATIENT_T onePatient;

上面已经声明了typedef,对此感到抱歉。

这是程序功能:

void checkGender(char pointerGender)
{
char gender;
char buffer[32];
char word_M = ('M'); /* Male */
char word_F = ('F'); /* Female */
char word_N = ('N'); /* None */

printf("\nEnter Gender: ");
fgets(buffer,sizeof(buffer),stdin);
//strcpy(&gender,buffer);
sscanf(buffer,"%c",&gender);

while((strcasecmp(&gender,&word_M) != 0)||(strcasecmp(&gender,&word_M) != 0)||(strcasecmp(&gender,&word_N) != 0))
{
    printf("\nError: Invalidate Grade");
    printf("\n(Please enter wheather M [for Male], F [for Female] or N [for None])");
    printf("\nEnter gender: ");
    fgets(buffer,sizeof(buffer),stdin);
    //strcpy(&gender,buffer);
    sscanf(buffer,"%c",&gender);
}

}

这是在主函数中:

int main()
{
    char pointerGender;

    PATIENT_T onePatient;

    checkGender(pointerGender);
    strcpy(&onePatient.gender,&pointerGender);

    printf("\n%s",&onePatient.gender);
}

终端展示:

192:iHeal Hospital iFluke$ gcc -o checkFormat_Fluke checkFormat_Fluke.c
192:iHeal Hospital iFluke$ ./checkFormat_Fluke

Enter Name: fluke

Enter Gender: M

Error: Invalidate Grade
(Please enter wheather M [for Male], F [for Female] or N [for None])
Enter gender: F

Error: Invalidate Grade
(Please enter wheather M [for Male], F [for Female] or N [for None])
Enter gender: N

Error: Invalidate Grade
(Please enter wheather M [for Male], F [for Female] or N [for None])
Enter gender: 

【问题讨论】:

  • 另外,onePatient 的声明也不见了。
  • 什么是 PATIENT_T(再次)? ...好吧,strcpy 用于字符串、字符和类对象。不太可能这没问题。 => 整个代码看起来像废话。
  • 编译所有警告和调试信息 (gcc -Wall -Wextra -g) 然后使用调试器 (gdb)
  • 顺便说一句,PATIENT_T onePatient; 不是 typedef,而是一个普通的实例。
  • 好吧,然后是一本 C 书。 typedef、strcpy 用法等在两种语言中都是无效的。

标签: c function scanf eof abort


【解决方案1】:

您不能使用strcasecmp 来比较字符。这不是完全错误,但单个字符不是正确终止的字符串。

如果一定要这样比较,请使用strncasecmp:

if(strncasecmp(&gender,&word_M, 1) == 0)

这将限制它只比较一个字符。

此外,您的重试循环不会检查“F”,而是检查“M”两次。

【讨论】:

    【解决方案2】:

    既然你的输入只是一个字符,你为什么要声明 buffer[32] ?

    使用类似的东西

    char input;
    scanf("%c" &input);
    

    【讨论】:

      【解决方案3】:

      请检查以下代码。我认为,它解决了你的目的,减去了复杂性。

      注意:

      1. EOF 是通过按 CTRL + D

      2. 实现的
      3. 此代码不区分大小写 [Mm 表示相同的内容]。

      代码:

      #include <stdio.h>
      #include <stdlib.h>
      
      int main()
      {
          char userInput;
      
          printf("Enter the Gender ( M [for Male], F [for Female] or N [for None] )\n");
          while ( scanf (" %c", &userInput) != EOF )
          {
          switch (userInput)
          {
              case 'M':
              case 'm':
                          printf("Male\n");
                          break;
      
              case 'F':
              case 'f':
                          printf("Female\n");
                          break;
      
              case 'N':
              case 'n':
                          printf("None\n");
                          break;
      
              default:
                      printf("Wrong value !!!\n");
          }
          }
          return 0;
      }
      

      【讨论】:

      • 感谢您的帮助!
      • @Sourav 你给学生完整的代码并没有帮助他们!!
      • @Manav 请解释您的评论。
      • 家庭作业问题的根本问题是,如果你给某人一个家庭作业问题的剪切和粘贴答案,他们不会学到任何东西,但是很难写出一个可以教的答案海报的东西,但也将对未来的读者有用。引用自meta.stackoverflow.com/questions/255477/…
      • @Manav 在阅读链接的答案之前,请阅读问题。它说,在目标帖子中[现已删除]There's no attempt at a solution, just a bare-bones statement of the problem. 在这个 Q 中,OP 发布了他/她的代码 i/p - o/p 并表现出一些努力。这并不完全符合Homework 问题标签的条件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      相关资源
      最近更新 更多