2013-11-23 2 views
3

Я пытаюсь написать программу, которая включает в себя сравнение символов как части системы меню для программы, которая декодирует коды резисторов. В конце меню он спрашивает, хотите ли вы декодировать другой резистор, повторяя программу, если пользователь выбирает «да».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». Здесь что-то не хватает?

+10

символьных литералов понадобятся char_literal характера, например. '' y'' not '" y "' – amdixon

+0

И причина, по которой вы получаете сообщение об ошибке, касающееся указателя, состоит в том, что строковый литерал имеет тип массива, а выражение массива в большинстве контекстов неявно преобразуется в указатель на первый элемент массива. Таким образом, 'menuChoice! =" Y "пытается сравнить целочисленное значение' menuChoice' ('char' - целочисленный тип) с значением указателя, которое получается из неявного преобразования' 'Y" 'в' char * '. Сравнение не имеет никакого смысла. На самом деле я нахожу это разочаровывающим, что gcc просто предупреждает об этом; он мог бы, и ИМХО, относиться к нему как к фатальной ошибке. –

+0

@KeithThompson, если gcc начал давать ошибки для неявных конверсий-целых чисел, он мог бы пробудить кучу людей, чтобы исправить свой старый код –

ответ

0

Отрегулируйте свои сравнения. В настоящее время они сравнивают целое число (или char, такое как menuChoice) с массивом (например, «y»).

// menuChoice != "y" 
menuChoice != 'y' 

Возможно, необходимо удалить while(menuChoice != "y") && ...).

if(menuChoice == "N" ... должно быть else if(menuChoice == "N" ...).

2

Вы используете строковый литерал синтаксиса "a" вместо буквального синтаксиса обугленного 'a'

More about the difference

Смежные вопросы