Ошибка: неправильное сравнение между указателем и целым числом - PullRequest
0 голосов
/ 21 октября 2018

Мой код выглядит нормально, но я получаю это предупреждение (предупреждение: сравнение между указателем и целым числом), что является лучшим решением для решения этой проблемы?Я уже использовал двойные обозначения для (char exit = "E"), также использовал то же самое с while, но с той же проблемой.

#include <stdio.h>

int main()
{
    char c[1];
    char exit = 'E';

    while (c != exit)
    {
        printf("Enter a character\n\n");
        scanf("%s", c);
        printf("your character is : %s\n-------------------\n", c);
    }
}

Ответы [ 2 ]

0 голосов
/ 21 октября 2018
#include <stdio.h>

int main()
{
    char c[1];
    char exit = 'E';

    while (c != exit)  // here ...
    {
        printf("Enter a character\n\n");
        scanf("%s", c);
        printf("your character is : %s\n-------------------\n", c);
    }
}

вы пытаетесь сравнить char с указателем, к которому распадается массив c.Возможно, вам хотелось бы сравнить первый символ массива с символом exit:

while (c[0] != exit)

Но это по-прежнему не имеет большого смысла, поскольку c неинициализирован, а пользователь нееще был шанс сделать какой-либо вклад.Лучше использовать do ... while -loop:

#include <stdio.h>

int main()
{
    char c[1];
    char exit = 'E';

    do {
        printf("Enter a character\n\n");
        scanf("%s", c);
        printf("your character is : %s\n-------------------\n", c);
    } while (c[0] != exit);
}

Следующее, что scanf("%s", c); может потерпеть неудачу (да, маловероятно, но возможно).И пользователь может ввести больше символов, чем предусмотрено в массиве c.Никогда не следует использовать scanf() без проверки возвращаемого значения и "%s" без указания WIDTH для спецификатора преобразования, чтобы ограничить количество символов, помещаемых в массив.

При чтении строки вам нужна память для WIDTH символов + завершающий '\0'.Поэтому, если вы хотите прочитать строку из одного символа, массив должен содержать как минимум 2 элемента:

#include <stdlib.h
#include <stdio.h>

int main()
{
    char c[2];
    char exit = 'E';

    do {
        printf("Enter a character\n\n");
        while (scanf("%1s", c) != 1 ) {
            fputs("Input error!\n");
            return EXIT_FAILURE;
        }
        printf("your character is : %s\n-------------------\n", c);
    } while (c[0] != exit);
}

Но если вы хотите прочитать только один символ, вам лучше использовать getchar():

#include <stdio.h>
{
    int ch;
    while (printf("Enter a character\n\n"),
           (ch = getchar()) != EOF && ch != 'E')
    {
        printf("your character is: %c\n-------------------\n", (char) ch);
    }    
}
0 голосов
/ 21 октября 2018

Я верю, что это то, что вы пытаетесь сделать.

Предупреждение, потому что вы не инициализировали своего персонажа, а также сравнивали адрес символа со значением символа.

#include <stdio.h>

int main()
{
    char c[1];
    char exit = 'E';

    while ((c[0]=getchar()) != exit)
    {
        if(c[0]==EOF)break;
        printf("your character is : %c\n",c[0]) ;
    }
    printf("ended");
}
...