Intereting Posts
Как промыть трубы для очистки буфера в C, когда обе трубы являются частью одного процесса? Почему какой-то код из K & R не работает в Code: Blocks? Как получить последнюю клавишу нажатой без остановки программы C? Пространственная локальность в цикле Понимание кэша ЦП и строки кэша Среднеквадратичный расчет SSE Отсутствуют данные управления streamом (0x13) из streamа данных считывающего устройства Многие процессы, выполняемые одним streamом Многопоточный сервер в LInux Как преобразовать строку в массив символов в c (или), как извлечь одну строку формы символа? Неожиданные результаты операторов побитового сдвига C / C ++ Не получать ожидаемый результат, используя cmpxchg8b для unsigned long mmap () не работает с ENOMEM в 1TB ANONYMOUS файле? Что является удобной базой для библиотеки bignum и алгоритма тестирования первичности? Не удается подключиться к уже активному экрану через систему () в c

Сравнение между указателем и целым числом в C

У меня есть немного глупый вопрос о программе в C. Мой компилятор говорит мне: предупреждение: сравнение между указателем и целым числом . Я действительно не знаю, почему. Я хочу только написать каждый символ на экране.

Мой код:

int i = 0; char str[50] = {'s', 'a', 'm', 'p','l','e'}; //only for test while (str[i] != NULL) { putchar(str[i]); i++; } 

Не могли бы вы мне помочь? Я не нашел полезного ответа в Интернете.

NULL является указателем, а str[i] является i-м символом массива str. char и целочисленный тип, и по мере их сравнения вы получаете предупреждение.

Я думаю, вы хотите проверить конец строки, что бы вы сделали с проверкой для символа со значением 0 (конец строки), то есть '\0' .

BUT: это не поможет вам, как вы определяете его так же, как и массив символов, а не как строку, и вы не определили оконечное число 0 в массиве символов (вам просто повезло, что оно там неявно).

PS: В следующий раз вы должны дать хотя бы информацию, в которой компилятор жалуется.

NULL следует использовать только в контекстах указателей, но здесь вы сравниваете его с символом.

Вы обычно хотите что-то вроде:

 while (str[i] != '\0') { 

[или, конечно, что-то вроде puts(str); или printf("%s", str); ]

Вам нужно сравнить значение str [i] с завершающим «\ 0» строки, а не NULL, которое считается указателем. Ваш

while (str[i] != NULL ) {

изменился на

while (str[i] != '\0') {

ниже:

 int i = 0; char str[50] = {'s', 'a', 'm', 'p','l','e'}; //only for test while (str[i] != '\0') { putchar(str[i]); i++; } 

str[i] является символом. NULL – это указатель. Вы не можете достоверно сравнивать эти два типа данных (хотя они могут или не могут быть реализованы как один и тот же размер целого внутри). Это все сообщения об ошибках.

Не то, чтобы сравнение было не только неправильным по типу, но и тем, что вы, вероятно, не имеете в виду. Вы полагаете, что массив символов с неполным инициализатором будет автоматически завершен символом \ 0, но это правило применяется к строковым литералам, а не к массивам символов, которые вы создаете сами. Как бы то ни было, вы вызываете неопределенное поведение.

Самая большая проблема с этим кодом заключается в том, что в зависимости от вашей реализации он может компилироваться без ошибок.

Проблема, как говорили другие, заключается в том, что NULL предназначен для представления значения нулевого указателя , а не для значения нулевого символа . Используйте '\0' для обозначения нулевого символа. (Или вы можете использовать 0 , что эквивалентно, но '\0' выражает намерение более четко.)

NULL – это макрос, который расширяется до константы нулевого указателя, определяемой реализацией. Константа нулевого указателя может быть либо целочисленным константным выражением со значением 0 , либо таким выражением, отличным от void* . Это означает, что NULL может быть задан либо как 0 либо как ((void*)0) (среди других вариантов).

По-видимому, ваша реализация определяет его как нечто вроде ((void*)0) , поэтому вы получили предупреждающее сообщение. (Он мог бы, и ИМХО должен был рассматриваться как фатальная ошибка).

Поэтому никогда не пытайтесь использовать NULL кроме как константу нулевого указателя, и не рассчитывайте на компилятор, чтобы предупредить вас, если вы злоупотребляете им.

NULL определяется как тип указателя, обычно (void*)0 . Это означает, что его нельзя сравнивать с персонажами (которые используются для использования в целых числах, когда они используются сами по себе). Проблема заключается в следующем: str[i] != NULL . Правильный способ сделать это – сравнить его с чем-то одного типа, в этом случае вы ищете нулевой символ '\0' .

Здесь str [i] является символом, который NULL является указателем, поэтому мы не можем сравнивать его логически. Используйте ‘\ 0’ для сравнения с str [i], поскольку он определен как нулевой символ, поэтому сравнение символа str [i] с нулевым символом ‘\ 0’ является правильным методом и не будет через какое-либо предупреждение.

напишите свой код следующим образом:

 int i = 0; char str[50] = {'s', 'a', 'm', 'p','l','e'}; //only for test while (str[i] != "\0") { putchar(str[i]); i++; }