2013-05-03 4 views
0

Я новичок в C и имею проблемы с программой ниже. Он спрашивает людей, хорошо они или нет, и соответственно отображает сообщение. До сих пор я пробовал использовать !strcmp, strcmp и strncmp, и ни один не возвращает положительное значение для if, все пропускают к заявлению else. Может ли кто-нибудь указать мне, где я ошибаюсь, поскольку синтаксис кажется мне прекрасным.Strcmp in C Не работает

#include "stdafx.h" 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char well[3]; 

    printf("Hello, are you well today? (Yes/No) "); 
    scanf_s ("%s",well); 
     if (!strcmp(well,"Yes")){ 
      printf("Glad to hear it, so am I\n"); 
    } 
    else{ 
     printf("Sorry to hear that, I hope your day gets better\n"); 
    } 
system("PAUSE"); 
return 0; 
} 

Большое спасибо всем за ответы, к сожалению, ни один из них, похоже, не работает. Присвоение 4 для учета нулевого значения не имеет значения. Вызов scanf, а не scanf_s, приводит к нарушению доступа (что является нечетным, так как остальная часть программы использует plain scanf. Добавление параметра «4» в scanf_s также не имеет значения. Действительно, разрывая мои волосы здесь, я рад разместить null в конце строки, но программа, похоже, не распознает ее.

+1

'strcmp' _does_ хорошо работает. Убедитесь, что вы используете его правильно. – vonbrand

ответ

5

Строка "Yes" включает в себя нулевой ограничитель и выглядит как {'Y', 'e', 's', '\0'}, поэтому для этого требуется 4 символа, поэтому их нельзя безопасно читать в 3-элементный char массив, так что вы должны дать well по крайней мере 4 элементов

char well[4]; 

или, как это было предложено Лундин

#define MAX_RESPONSE (sizeof("Yes")) 
char well[MAX_RESPONSE]; 

paxdiablo пояснил, что вы также не вызываете sscanf_s правильно. Одним из возможных решений здесь, чтобы переключиться на вызов scanf, передавая размер макс строки и проверки пользовательского ввода

while (scanf(" %3s", well) != 1); 

Из, придерживающийся scanf_s

while (scanf_s(" %s", well, sizeof(well)-1) != 1); 
+1

Или еще лучше, не используйте странные магические числа в коде. '#define WORST_CASE (sizeof (" Да "))' ... 'char well [WORST_CASE];' – Lundin

+0

@Lundin Хорошая точка, я обновил свой ответ, как было предложено – simonc

+0

Большое спасибо за совет, к сожалению, попробовав предложенный didn ' t, похоже, не влияет. – user2346526

1

Для начала, вам не хватает пространство в well для хранения 3 символов и нулевой ограничитель.

И scanf_s безопасен, потому что требует (см here) определенные строки формата, как s иметь длину, что вы пропали без вести.

+0

Большое спасибо за совет, к сожалению, попробовав предлагаемый, похоже, не повлияло. – user2346526

0

выделить 4 bytes в well для завершающих null характера .. это решает проблему ..

char well[4]; 
+0

Большое спасибо за совет, к сожалению, попробовав предлагаемый, похоже, не повлияло. – user2346526

0
scanf_s ("%s",well); 

scanf_s требует длины строки:

scanf_s ("%s", well, 4); 

и

char well[4]; 
0

Каждый массив символов, в котором хранится строка, имеет дополнительный символ \0, который служит в качестве ограничителя строк. Это означает конец строки. Для этого "Yes" нужен массив размером sizeof(char)*4. В вашей программе только первая 3 символа сохраняются в well.Поэтому strcmp() возвращает ненулевое число, и, следовательно, !strcmp всегда 0 благодаря которому управление всегда переходит к else .The следующий рабочий код:

#include "stdafx.h" 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char well[4];// "Yes" needs sizeof(char)*4, to account for the end `\0` 

    printf("Hello, are you well today? (Yes/No) "); 
    scanf ("%s",well);  //Use scanf(),scanf_s() works for Uncle Gates only 

     if (!strcmp(well,"Yes")) 
     printf("Well...glad to hear it, so am I\n"); 

     else 
     printf("Sorry to hear that,umm....can I take your wife out?\n"); 

system("PAUSE"); //This works for Uncle Gates only (not portable) 
return 0; 
} 
+0

Я бы не использовал 'scanf (% s)' либо, вы меняете непереносимое решение (что на самом деле не так уж плохо, если вы знаете, что вы не будете отходить от MSVC++) для небезопасного - см. Здесь для почему: http://stackoverflow.com/questions/4023895/how-to-read-string-entered-by-user-in-c/4023921#4023921 – paxdiablo

+0

@paxdiablo Всегда есть 'gets()', чтобы отступить на. –

+0

@paxdiablo 'wont 'отходит от мира MS - это отношение, почему я чуждо миру Linux по сей день и сожалею о каждом моменте этого. –

0

выделить 4 байта хорошо, то MemSet на NULL , затем попробуйте

char well[4]; 
memset(well,0,4)