2012-04-19 2 views
4

У меня есть немного глупый вопрос о программе в 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++; 
} 

Можете ли вы помочь мне, пожалуйста? Я не нашел полезного ответа в Интернете.

+2

попробуйте сравнить с '\ 0' :) coz NULL of the course - указатель. – Milee

ответ

7

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

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

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

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

8

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

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

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

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

2

Вам нужно сравнить ул [я] 's значение с завершающего' \ 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++; 
} 
-2

пожалуйста, напишите код, как это

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

Сравнение с строковым литералом кажется неправильным (не будет '' '' давать свой адрес?). –

+0

@JesseGood: сравнение со строковым литералом * неверно; это нарушение ограничений, требующее диагностики. Santhosh: Вы должны скомпилировать свой код, прежде чем публиковать его. –

0

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

1

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

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

0

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

1

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

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

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

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

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

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