Что означает * переменная! = 0? - PullRequest
0 голосов
/ 22 октября 2019
char *e; 
while(*e!=0)
{
  if(isalnum(*e))
    printf("%c",*e);

  e++;
} 

Но *e - это указатель, верно? Так что адрес должен быть напечатан, верно?

Ответы [ 3 ]

4 голосов
/ 22 октября 2019

Но * e - это указатель, верно?

Нет. e это указатель. *e является первым char, на который он указывает. При использовании в выражении (а не в объявлении типа) в качестве унарного оператора (оператора с одним операндом) * является оператором косвенного обращения .

Что означает * переменная! = 0?

Предполагается, что цикл действительно:

while(*e!=0)

... это означает, что цикл должен продолжаться, пока chare указывает на !=0. Строки C оканчиваются на 0 char, '\0' (но обычно пишутся просто 0).


Следует отметить, что цикл в вопросе, помимо основных опечаток, таких какChar вместо char и While вместо while имеет основную логическую ошибку: никогда не изменяется значение e в теле цикла. Это означает, что если он зацикливается один раз, он будет зацикливаться вечно;где-то нужно ++e;(e также никогда не инициализируется.) Так, например:

char *e = /*...something...*/;
while (*e != 0)
{
    if(isalnum(*e)) {
        printf("%c",*e);
    }
    ++e;
}

или, на самом деле, для этого for:

char *e;
for (e = /*...something...*/; *e != 0; ++e)
{
    if(isalnum(*e)) {
        printf("%c",*e);
    }
}
1 голос
/ 22 октября 2019

Для начала есть опечатки

Char *e; 
^^^^
While(*e!=0)
^^^^
{
 if(isalnum(*e))
        printf("%c",*e);
} 

Вы имеете в виду

char *e; 
while(*e!=0)
{
 if(isalnum(*e))
        printf("%c",*e);
} 

Более того указатель e не инициализирован. Он должен быть инициализирован строкой. Например,

char *e = "FaThima Hussain"; 
while(*e!=0)
{
 if(isalnum(*e))
        printf("%c",*e);
} 

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

char *e = "FaThima Hussain"; 
while( *e!=0 )
{
     if(isalnum(*e))
         printf("%c",*e);
     ++e; 
} 

В состоянии цикла while есть символ, на который указывает указатель e, сравнивается с нулем, что фактически является нулевым завершающим символом. Поэтому было бы лучше написать

char *e = "FaThima Hussain"; 
while( *e != '\0' )
{
     if(isalnum(*e))
         printf("%c",*e);
     ++e; 
} 

Каждая строка в C включает и оканчивается нулевым символом в конце. Таким образом, в условии есть проверка, является ли это концом строки. Если нет, то введите в теле цикла.

При вызове функции isalnum вы должны привести символ к типу unsigned char, как того требует функция.

Вот демонстративный пример. program.

#include <stdio.h>
#include <ctype.h>

int main(void) 
{
    char *e = "FaThima Hussain"; 

    while( *e != '\0' )
    {
         if ( isalnum( ( unsigned char )*e ) )
             printf( "%c", *e );
         ++e; 
    } 

    putchar ( '\n' );

    return 0;
}

Вывод программы:

FaThimaHussain

То есть пустые символы не выводятся, поскольку они не являются буквенно-цифровыми символами.

0 голосов
/ 22 октября 2019

Существует старое правило C: объявление напоминает использование . Поэтому, если char *e является объявлением хранилища для указателя на char, используется *e, .ie доступ к объекту, указанному e.

Предоставленный код также содержит UB, поскольку eне инициализируется. Результат проверки переменной, которая не была инициализирована, не определена. Разыменование такого указателя также будет неопределенным, поскольку по определению этот указатель ни на что не указывает и не является нулевым указателем.

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