在C中正确比较字符串

时间:2014-11-26 10:33:38

标签: c string if-statement

我必须制作一个程序,其输入必须是2个值之一,'M'或'F'。

以下是我为了演示而创建的程序段

do
{

     printf("What is your Gender? (M for Male - F for Female) "); 
     fgets(GenderValue, 16, stdin); 

     if (GenderValue[0] == '\n') 
     {
           printf("Try again");
           getch();
           system("cls");
           loop=1;
     }
     else
     {
           loop = -1;
     }
     if (GenderValue == "M");
     {
          loop =-1;
     }
     else if(GenderValue == "F");
     {
          loop=-1;
     }

     else
     {
           printf("Try again");
           getch();
           system("cls");
           loop=1;
     }



 }
 while(loop > 0); //Checks for NULL input

 printf("Gender: %s",GenderValue);

我知道我可以做一个整数选择输入,但如果可能的话我想稍后回收它。

到目前为止程序调用我的性别值比较“错误”,这很好,除了我不知道下一步该做什么,我可以找到一个比较字符串的函数,但我真的不想让我的复杂化代码。

编辑:重复?,真的吗?,给出的例子甚至没有接近帮助我。

编辑2:发现问题,我有;在我的if语句旁边,现在已修复。但说真的,没有人发现这个?

5 个答案:

答案 0 :(得分:6)

您使用strcmp来比较字符串。使用比较运算符==只需比较指针

但请注意fgets会在字符串中留下结尾换行符,因此您需要将其与例如"M\n",或者删除换行符。

另请注意,scrcmp 区分大小写,字符串"M"不等于字符串"m"


您可以使用例如scanf将输入作为单个字符读取,并使用例如tolower(或toupper)获得不区分大小写的比较。

但是,使用scanf会带来其他问题,特别是如果您之后再次使用它来阅读另一个单个字符。原因是Scanf将换行符留在输入缓冲区中,导致可能的scanf格式的"%c"调用读取该换行符。有非常的简单解决方案:告诉scanf使用" %c"读取和弃用前导空格。

答案 1 :(得分:1)

  1. 如果GenderValue是字符串,则GenderValue == "M"错误。字符串不应与==一起使用。使用strcmp()

  2. [在这种情况下,IMO是合适的]如果GenderValue是单个字符,则应该以{{1​​}}

  3. 进行比较

    对于您的情况,[考虑一个字符输入]您可以执行类似

    的操作
    GenderValue == 'M'

    在上面的代码中,有三个优点

    • 您无需为删除由此引起的尾随fgets(GenderValue, 16, stdin); switch(GenderValue[0]) { case '\n': //your code break; case 'M': case 'm': //your code break; case 'F': case 'f': //your code break; default: } 而烦恼 \n
    • 只考虑一个字符输入
    • 无需担心输入的大小写。

答案 2 :(得分:1)

(GenderValue == "M")替换为(strcmp(GenderValue, "M") == 0 )

(GenderValue == "F")替换为(strcmp(GenderValue, "F") == 0 )

答案 3 :(得分:0)

尝试将GenderValue == "F"替换为!strcmp(GenderValue, "F\n"),将GenderValue == "M"替换为!strcmp(GenderValue, "M\n")

您可能还需要加入"string.h"

答案 4 :(得分:0)

每当需要比较字符串时,请使用字符串比较函数(strcmp(“”))。