Чтение в строке и сравнение ее C - PullRequest
4 голосов
/ 05 апреля 2010

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

Все, что я делаю, никогда не бывает условным:

char *input= "";
fgets(input, 50, stdin);
printf("%s",input);
printf("%d",strcmp( input,"arrive\0"));
if(strcmp( input,"arrive\0")==0){....

Я довольно новичок в c и нахожу строки действительно раздражающими.

Что я делаю не так?

Примечание: текущий код вызывает сбой моей программы: (

Ответы [ 3 ]

7 голосов
/ 05 апреля 2010

Почему strcmp всегда возвращает не 0:

strcmp вернет 0 только тогда, когда строки идентичны. Что касается того, почему он оценивает по-разному всегда. Это потому, что fgets помещает символ новой строки в конец входного буфера до нулевого завершения.

/*Will print 0 if you type in arrive<enter>*/
printf("%d",strcmp( input,"arrive\n"));

Почему ваша программа дает сбой:

Другая проблема заключается в том, что input должен быть буфером символов. Вот так: char input[1024]; В настоящее время у вас есть input в качестве указателя на строку с нулевым символом в конце (которая доступна только для чтения)


Дружеское предложение:

Также не помещайте нулевой терминатор \0 внутри строковых литералов. Это подразумевается автоматически, когда вы используете строковый литерал. В случае strcmp не имеет значения дважды завершать нулем, но это может вызвать проблемы в других ваших будущих программах. И люди будут удивляться, почему вы делаете двойное нулевое завершение.

3 голосов
/ 05 апреля 2010

Попробуйте:

#define BUFF_LEN 256

char input[BUFF_LEN];

fgets(input, BUFF_LEN, stdin);

То, что у вас есть, *input - это указатель на адрес памяти, который не был выделен, поэтому не может использоваться вашей программой. Результат его использования не определен, но обычно приводит к segmentation fault. Если вы хотите получить к нему доступ в качестве указателя, сначала вам нужно выделить его:

char *input = malloc(BUFF_LEN);

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

Edit:

По крайней мере, в соответствии с единственной спецификацией UNIX , fgets () гарантирует нулевое завершение буфера. Нет необходимости инициализировать ввод [].

Как уже говорили другие, нет необходимости включать нуль / новые строки при использовании strcmp ().

Я также настоятельно советую вам привыкнуть к использованию strncmp() сейчас, пока начинаете избегать многих проблем в будущем.

1 голос
/ 05 апреля 2010

Попробуйте заменить первую строку на

char input[50];
memset(input, 0, sizeof(input));

Edit: Однако настоящая проблема, почему strcmp не возвращает 0, заключается в том, что вам нужно «обрезать» строку, прочитанную из fgets, которая в большинстве случаев включает символ новой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...