Как я могу проверить, пустой ли символ *? - PullRequest
0 голосов
/ 01 июня 2018

Как я могу проверить, пусто ли char *name?

#include <stdio.h>
#include <string.h>

void store_stuff(char **name, int *age);
int main(void) {

    char *name;
    int age;

    store_stuff(&name, &age);

    printf("Name: %s\n", name);
    printf("Age: %d\n", age);

}

void store_stuff(char **name, int *age) {

    *age = 31;

    if (name == NULL) { // how can I check here if char name is empty?
        *name = "ERROR";
    }

}

Ответы [ 4 ]

0 голосов
/ 01 июня 2018

Ваш вопрос кажется ясным, но код, показанный вместе с ним, делает его менее понятным:

if (name == NULL) { // how can I check here if char name is empty?
    *name = "ERROR";
}

Это неопределенное поведение. Если name действительно равно NULL, вы не можете разыменовать его, но это то, что вы делаете в следующей строке.

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

store_stuff(&name, &age);

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


В общем, неясно, чтоВы имеете в виду под "пустым".Для указателей есть специальное значение NULL, которое означает «этот указатель ни на что не указывает».Но это не означает «пустой», оно по-прежнему имеет значение: NULL.

В контексте строк пустое значение будет иметь четко определенное значение.Поскольку строки в C определены как последовательность символов, заканчивающаяся байтом \0, строка empty имеет \0 в качестве самого первого символа.Таким образом, предполагая, что char *str является строкой, вы можете проверить наличие пустой строки, например

if (*str == 0)

или даже более короткой:

if (!*str)

Имейте в виду, что это приведет к неопределенному поведению, если str равно NULL (не указывает на любую строку ).Если вы ничего не знаете об этом и должны проверить, что он действительно указывает на строку, и эта строка не пуста, вы можете написать что-то вроде

if (!str || !*str)

, что примерно эквивалентно IsNullOrEmpty()метод для строки .NET ...

0 голосов
/ 01 июня 2018

Указатели не являются «пустыми», они либо указывают на действительные данные или недействительные данные.Контролируемый способ указать им на недопустимые данные - присвоить их NULL.Таким образом, правильный способ написания программы будет:

char *name = NULL;
int age;
store_stuff(&name, &age);

...

void store_stuff(char **name, int *age) {
  if(*name == NULL)
  {
    // handle error
  }
  ...
}
0 голосов
/ 01 июня 2018

следующим образом:

if (*name == NULL) {/*your code*/}

просто убедитесь, char *name=NULL

0 голосов
/ 01 июня 2018

Как я могу проверить, является ли символ *name пустым? name не инициализируется в функции main(), сначала назначьте NULL на name как

char *name =  NULL; /* now its initialized */

Дело-1:

int main(void) {
    char *name =  NULL;
    store_stuff(&name, &age);
    /* code */
    return 0;
}

И затем проверьте *name содержимое в store_stuff() как

void store_stuff(char **name, int *age) {
    if (*name == NULL) { /* since name is double ptr here, *name means NULL in the main() if it is */
     /* error handling */
    }
 }

Дело-2: если name содержит некоторые данные, такие как char *name = "Zoey"; в main() функции.

int main(void) {
    char *name = "Zoey" ;
    store_stuff(&name, &age);
    /* code */
    return 0;
}

, то условие ниже не будет выполнено, и я надеюсь, что это то, что вы хотите

void store_stuff(char **name, int *age) {
    if (*name == NULL) { /* now its not NULL as it holds some data */
     /* error handling */
    }
}
...