2015-04-17 3 views
0

Я довольно новичок в C, поэтому я не слишком знаком с его синтаксисом, однако я отлаживал свой код и исследовал его для правильного синтаксиса, и это кажется правильным, я также изменил масштаб переменных, чтобы увидеть, вызвало ли это ошибку.Если оператор в C всегда возвращает false

Оператор if должен сравнивать две переменные, которые содержат строки, я даже напечатал обе переменные, чтобы убедиться, что они одинаковы, однако он все равно переходит прямо в раздел else инструкции if. Может ли кто-нибудь дать мне какие-либо указания на то, почему он не будет запускать оператор if, он просто переходит прямо к «неправильному».

Переменная correctWord определяется в другом разделе кода.

Найти полный код here.

-UPDATE-

я теперь обновил синтаксис кода, однако он по-прежнему возвращается ложью.

Output screen

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

Используйте 'strcmp' или' strncmp' для сравнения строк. – ouah

+0

Вы не устанавливаете значение correctWord. Сравнение должно быть, если (strcmp (userWordGuess, correctWord) == 0) {... – CoreyStup

+0

correctWord и userWordGuess являются указателями! они представляют адрес, где указаны две строки из 20 байтов! Потому что вы хотите сравнить строки, решение о том, как CoreyStup говорит вам! –

ответ

6

Вы не может сравнивать строки в C помощью ==, потому что сравнивает адреса из строк, а не содержимое строки. (что вам, разумеется, не требуется, и, очевидно, адреса двух строк тоже не равны.)

C имеет довольно приятную функцию для него: strcmp(), которая возвращает 0, если обе строки равны.

Попробуйте использовать это в вашем if состоянии:

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

Обязательно #include <string.h> перед использованием strcmp().

+0

Спасибо за вашу помощь, я пробовал это, но он все еще возвращает ложь, найдите полный код здесь http://codepad.org/EQoXktaS –

+0

@TobyCannon Вероятно, вы не читаете ввод пользователя правильно. Вам нужно будет отбросить символы строки из stdin. – Lundin

3

Вы сравнения адресов различных массивов, которые всегда будут неравными.

Вам нужно использовать strcmp или какую-либо другую библиотечную функцию для сравнения символов строк по символам.

2

userWordGuess == correctWord будет сравнивать указатели (т. Е. Местоположения в памяти массивов), которые, вероятно, не равны.

Для струнного Comparision в C, используйте strcmp (или strncmp):

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

В C, вы не можете сравнивать строки с помощью ==. В итоге вы сравните адреса строк, которые не совпадают.

Вы должны вызвать функцию strmcp(), которая вернет 0, если его аргументы (две строки) равны.

Таким образом, код должен быть if(strcmp(userWordGuess, correctWord) == 0).

+0

Спасибо, попытался реализовать это, и он все равно все время возвращает false? –

+1

@TobyCannon Объяснение на вашем скриншоте. Одна из ваших строк (одна из файлов, использующих 'fgets()'), заканчивается в новой строке, а другая - нет. – unwind

1

Использование

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

1

Струны не являются первоклассными гражданами на языке C. Строки представлены как массивы символов или указатели на такие массивы.

В обоих случаях переменная, которую вы используете для доступа к строке, является синонимом адреса в памяти первого символа строки.

Что вы сравниваете с userWordGuess == correctWord - это не строки, а их адреса в памяти. Поскольку userWordGuess и correctWord - это два разных массива символов, их адреса в памяти всегда разные, и их сравнение всегда будет производить 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 */ 
1

Что вы делаете здесь сравнение двух указателей. userWordGuess и correctWord указывают каждый на начало массива символов (это то, что вы определили в начале вашего примера кода).

Так что, если вы хотите сравнить два массива символов вы можете использовать функцию strcmp, определенную в string.h

Важно, что вы узнаете, связь между массивами и указателями. Арифметика указателя также важна здесь. Проверьте это: Arrays, Pointers, Pointer Arithmetic