Возникли проблемы с strcmp() - код компилируется, но, похоже, не работает
Я пытаюсь заставить пользователя дать мне оператор (либо +,-,/,*). Чтобы убедиться, что он / она делает это, я написал этот код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char operator;
printf("Enter operator: (+, -, *, /) \n");
do { scanf("%c", &operator); }
while ((strcmp(&operator, "+") != 0) || (strcmp(&operator, "-") != 0) || (strcmp(&operator, "*") != 0) || (strcmp(&operator, "/") != 0));
}
То, что в конечном итоге происходит, - цикл включается и выключается, даже если я ввожу правильный оператор. Любая помощь приветствуется. Спасибо:)
Изменить: (Фиксированный код)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char operator;
printf("Enter operator: (+, -, *, /) \n");
do { scanf(" %c", &operator); }
while ((strcmp(&operator, "+") != 0) && (strcmp(&operator, "-") != 0) && (strcmp(&operator, "*") != 0) && (strcmp(&operator, "/") != 0));
}
2 ответа
Функция strcmp
принимает строку с нулем в конце, а не символ По этой причине использование
strcmp(&operator, "+")
является причиной неопределенного поведения.
Ваш код может быть так же просто, как
while ((operator != '+') && ...)
Обратите внимание, что я также изменил ||
в &&
,
Вам также понадобится место перед "%c"
как это " %c"
так что если входной цикл повторяется, он очищает любой newline
это было оставлено во входном буфере.
РЕДАКТИРОВАТЬ: Вы, кажется, не сделал правильное исправление, я предлагаю
do {
scanf(" %c", &operator);
} while (operator != '+' && operator != '-' && operator != '*' && operator != '/');
Объявите оператор переменной следующим образом
char operator[2] = { '\0' };
И используйте это как
do { scanf("%c ", operator); }
while ((strcmp( operator, "+") != 0) && (strcmp(operator, "-") != 0) && (strcmp(operator, "*") != 0) && (strcmp(operator, "/") != 0));
}
Примите во внимание, что вместо использования многочисленных strcmp
Вы могли бы использовать одну функцию strchr