C 中的 If 语句总是返回 false

If statement in C always returning false

我是C的新手,所以不太熟悉它的语法,但是我已经调试了我的代码并研究了正确的语法,它似乎是正确的,我也改变了变量的范围看看这是否是导致错误的原因。

if 语句应该比较两个变量,它们都包含字符串,我什至打印了两个变量以确保它们相同,但是它仍然直接跳到 if 语句的 else 部分。谁能告诉我为什么它不会 运行 if 语句,它直接跳到 'incorrect'.

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");
    }
}

您正在比较不同数组的地址,它们总是不相等的。

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

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

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

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

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

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

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

使用

 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

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

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

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

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

使用strcmp()前务必#include <string.h>

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

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

你和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 */

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

因此,如果您想比较两个字符数组,可以使用 string.h

中定义的 strcmp 函数

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