Как исправить ошибку оператора if и «Результат сравнения со строковым литералом не указан»? - PullRequest
1 голос
/ 26 ноября 2011

Итак, я только начинаю (извините, noob-ness) и работаю над программой на C на Mac с Xcode. По сути, это просто scanf (), а затем множество операторов if, которые выдают заранее определенный вывод. Я написал это так, что XCode компилирует это без ссоры, но я получаю странную ошибку «Fix-it» и ничего не выводится, когда я пытаюсь запустить его.

char planet[9];

printf("Input the name of a planet\n");

 scanf("%c", &planet);

if (planet == "Earth")
    {printf("Earth is 150 million kilometers away from the sun");}

if (planet == "Mars") 
    {printf("Mars is 220 million kilometers away from the sun");} 

if (planet == ("Mercury"))
{printf("Mercury is 57 million kilometers from the sun");}

if (planet == ("Venus"))
    {printf("Venus is 108 million kilometers from the sun");}

if (planet == ("Jupiter"))
    {printf("Jupiter is 779 million kilometers from the sun");}

if (planet == ("Saturn"))
    {printf("Saturn is 1.73 billion kilometers from the sun");}

if (planet == ("Uranus"))
    {printf ("Uranus (haha) is 2.88 billion kilometers from the sun");} 

if (planet == ("Neptune"))
    {printf("Neptune is 4.5 billion kilometers from the sun");}

    return 0;

- это сам код, но я не могу заставить его работать.

Вот также ссылка на проект Xcode.

https://www.facebook.com/photo.php?fbid=252616984794310&set=a.106237419432268.11635.100001380326478&type=1&theater

Ответы [ 3 ]

4 голосов
/ 26 ноября 2011

Вы были бы намного счастливее, используя strcmp:

if (strcmp(planet, "Earth") == 0) {
    ...
}

Кроме того, %c сканирует один символ, а не строку.Вам нужно использовать %s для сканирования строки.И вам нужно указать максимальную длину, чтобы избежать переполнения буфера:

scanf("%8s", planet);

Максимальная длина на единицу меньше размера буфера, поскольку вы должны оставить место для терминатора NUL.

4 голосов
/ 26 ноября 2011

Адрес planet никогда не будет равен адресу любого из этих строковых литералов. Вам нужно использовать strcmp для сравнения содержимого строк вместо сравнения их адресов.

0 голосов
/ 26 ноября 2011

Вы сравниваете адреса планеты с адресом этих строковых литералов ... так что адреса не будут одинаковыми.Вместо этого вы должны сравнить содержимое обеих строк, поэтому сделайте следующее:

Сначала включите <string.h>, и в каждом операторе if напишите так:

if(!strcmp ( planet,"Earth" ))

Поскольку строки c нельзя сравнивать напрямую, выдля этого нужно использовать функцию strcmp.

функция strcmp

int strcmp ( const char * str1, const char * str2 );

эта функция сравнивает две строки, и возвращаемое значение будет:

a)Нулевое значение указывает, что обе строки равны.

b) Значение больше нуля указывает, что первый не соответствующий символ имеет большее значение в str1, чем в str2;И

в) значение меньше нуля указывает на обратное.

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