Я пытаюсь написать программу, которая включает в себя сравнение символов как части системы меню для программы, которая декодирует коды резисторов. В конце меню он спрашивает, хотите ли вы декодировать другой резистор, повторяя программу, если пользователь выбирает «да».C "сравнение между указателем и целым числом" предупреждение для меню
Это код, который я до сих пор:
//used for repeating input menu
int menu = 0;
char menuChoice = 0;
//rest of program goes here
printf("Do you want to decode another resistor? (y/n)");
scanf("%c", &menuChoice);
while(menuChoice != "y" && menuChoice != "Y" && menuChoice != "n" && menuChoice != "N")
{
if(menuChoice != "Y" && menuChoice != "y")
{
if(menuChoice == "N" || menuChoice == "n")
{
menu = 0;
}
else
{
printf("Invalid choice.");
}
}
}
Когда я пытаюсь скомпилировать с помощью GCC, я в конечном итоге с предупреждением, что говорит «сравнение между указателем и целое.» Поскольку scanf принимает только указатель, я не знаю, как точно сравнить отсканированный символ с «Y» или «n». Здесь что-то не хватает?
символьных литералов понадобятся char_literal характера, например. '' y'' not '" y "' – amdixon
И причина, по которой вы получаете сообщение об ошибке, касающееся указателя, состоит в том, что строковый литерал имеет тип массива, а выражение массива в большинстве контекстов неявно преобразуется в указатель на первый элемент массива. Таким образом, 'menuChoice! =" Y "пытается сравнить целочисленное значение' menuChoice' ('char' - целочисленный тип) с значением указателя, которое получается из неявного преобразования' 'Y" 'в' char * '. Сравнение не имеет никакого смысла. На самом деле я нахожу это разочаровывающим, что gcc просто предупреждает об этом; он мог бы, и ИМХО, относиться к нему как к фатальной ошибке. –
@KeithThompson, если gcc начал давать ошибки для неявных конверсий-целых чисел, он мог бы пробудить кучу людей, чтобы исправить свой старый код –