【问题标题】:If statement in C always returning false [duplicate]如果 C 中的语句总是返回 false [重复]
【发布时间】:2015-04-17 12:45:35
【问题描述】:

我对 C 比较陌生,所以不太熟悉它的语法,但是我已经调试了我的代码并研究了正确的语法,这似乎是正确的,我还更改了变量的范围以查看如果这是导致错误的原因。

if 语句应该比较两个变量,它们都包含字符串,我什至打印了两个变量以确保它们相同,但是它仍然直接跳到 if 语句的 else 部分。谁能给我任何关于为什么它不会运行 if 语句的指示,它只是直接跳到“不正确”。

correctWord 变量在代码的不同部分定义。

查找完整代码here

-更新-

我现在已经更新了代码的语法,但是它仍然返回 false。

char correctWord[20];

void userGuess(){
    char userWordGuess[20];

    printf("Anagram: ");
    printf(anagramWord);
    printf("Your Guess: ");
    scanf("%s",userWordGuess); //Reads in user input

    printf(correctWord);
    printf(userWordGuess);

    if(strcmp(userWordGuess, correctWord) == 0){
        printf("Congratulations, you guessed correctly!");
    }else{
        printf("Incorrect, try again or skip this question");
    }
}

【问题讨论】:

  • 使用strcmpstrncmp 比较字符串。
  • 你没有设置correctWord的值。比较应该是 if (strcmp(userWordGuess, correctWord)==0) {...
  • correctWord 和 userWordGuess 是指针!它们代表您声明的两个 20 字节字符串的地址!因为你想比较字符串,所以解决方案正如 CoreyStup 所说的那样!
  • 为什么投反对票?问题表达得好,问题清晰,相关代码展示,格式合理。
  • 我也不明白反对票,我试图对这个问题非常公平和清楚,尽管codepad.org/EQoXktaS 仍然无法让它发挥作用

标签: c if-statement strcmp c-strings


【解决方案1】:

不能使用== 比较C 中的字符串,因为这比较的是字符串的地址,而不是字符串的内容。 (你当然不需要,而且很明显,两个字符串的地址也不相等。)

C 有一个非常好的函数:strcmp(),如果两个字符串相等,则返回 0

尝试在您的 if 条件中使用它:

if (!strcmp(userWordGuess,correctWord))
{
     //Yay! Strings are equal. Do what you want to here.
}

在使用strcmp()之前一定要#include <string.h>

【讨论】:

  • 谢谢你的帮助,我试过了,但它仍然返回错误,在这里找到完整的代码codepad.org/EQoXktaS
  • @TobyCannon 可能您没有正确读取用户输入。您需要从标准输入中丢弃换行符。
【解决方案2】:

在 C 中,您不能使用 == 比较字符串。你最终会比较字符串的地址,这是不一样的。

您需要调用strmcp() 函数,如果其参数(两个字符串)相等,它将返回0

所以代码应该是if(strcmp(userWordGuess, correctWord) == 0)

【讨论】:

  • 谢谢,尝试实现这个,但它仍然总是返回 false?
  • @TobyCannon 解释在你的截图中。您的一个字符串(使用fgets() 从文件中读取的字符串)以换行符结尾,另一个则没有。
【解决方案3】:

你在比较不同数组的地址,这总是不相等的。

您需要使用strcmp 或其他一些字符串库函数来逐个字符地比较字符串。

【讨论】:

    【解决方案4】:

    userWordGuess == correctWord 将比较可能不相等的指针(即数组在内存中的位置)。

    对于 C 中的字符串比较,使用strcmp(或strncmp):

    if (!strcmp(userWordGuess, correctWord)){
        /*Strings are equal*/
    

    【讨论】:

      【解决方案5】:

      使用

       if(strcmp(userWordGuess, correctWord) == 0) // strings are equal
       {
            printf("Congratulations, you guessed correctly!");
       }
       else  // not equal
       {
            printf("Incorrect, try again or skip this question");
       }
      

      如果两个字符串都等于if 条件将运行。否则它将运行else

      【讨论】:

        【解决方案6】:

        字符串不是C 语言中的一等公民。字符串表示为字符数组或指向此类数组的指针。

        在这两种情况下,用于访问字符串的变量都是字符串第一个字符在内存中的地址的同义词。

        您与userWordGuess == correctWord 比较的不是字符串,而是它们在内存中的地址。由于userWordGuesscorrectWord 是两个不同的字符数组,所以它们在内存中的地址总是不同的,它们的比较总是会产生FALSE

        为了比较实际的字符串值,您必须使用标准函数 strcmp() 或其变体之一(在文档页面底部找到它们)。

        代码改动:

        /** Need to include the header that declares the strcmp() function */
        #include <string.h>
        
        char correctWord[20];
        
        void userGuess(){
            char userWordGuess[20];
        
            /** stripped some lines here ... */
        
            /** compare the strings, not their addresses in memory */
            if (strcmp(userWordGuess, correctWord) == 0) {
        
            /** the rest of your code */
        

        【讨论】:

          【解决方案7】:

          你在这里做的是比较两个指针。 userWordGuess 和 correctWord 分别指向一个字符数组的开头(这是您在示例代码开头定义的内容)。

          所以如果你想比较两个字符数组,你可以使用 string.h 中定义的strcmp 函数

          了解数组和指针之间的关系很重要。指针算法在这里也很重要。看看这个:Arrays, Pointers, Pointer Arithmetic

          【讨论】:

            猜你喜欢
            • 2019-05-11
            • 2015-08-11
            • 2020-08-09
            • 1970-01-01
            • 1970-01-01
            • 2012-11-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多