【问题标题】:How can I check if a char * is empty?如何检查 char * 是否为空?
【发布时间】:2018-06-01 13:46:56
【问题描述】:

如何检查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";
    }

}

【问题讨论】:

  • 什么是“空”?在开头将其初始化为NULL,并检查*name == NULL。然而,对我来说,它看起来像是 XY 问题。这整个方法将来会给你带来麻烦。
  • strlen 的工作原理是计算字符数,直到空字符 '\0' 您可以检查第一个字符是否等于 '\0'
  • 这位密歇根大学的学生还是看不懂指针……

标签: c string pointers char


【解决方案1】:

指针不是“空的”,它们要么指向有效数据,要么指向无效数据。使它们指向无效数据的一种受控方法是将它们分配给NULL。因此,编写程序的正确方法是:

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

...

void store_stuff(char **name, int *age) {
  if(*name == NULL)
  {
    // handle error
  }
  ...
}

【讨论】:

  • 附带说明,具有静态存储持续时间的指针会自动初始化为 NULL。
  • NULL 不是指向无效数据的指针。 C 标准并没有说它指向任何东西,无论是有效的还是无效的。它只是一个值,当转换为指针类型时,比较不等于指向任何对象或函数的指针,但比较等于空指针。因此它不指向任何对象或函数。并且指针不限于指向某物或作为空指针常量;它们也可能是无效值。
【解决方案2】:

如何检查char *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;
}

然后检查*namestore_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:如果namemain() 函数中保存了一些类似char *name = "Zoey"; 的数据。

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 */
    }
}

【讨论】:

    【解决方案3】:

    您的问题似乎很清楚,但与它一起显示的代码使它变得不那么清楚了:

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

    这是未定义的行为。 如果 name 真的是NULL,则不能取消引用它,但这就是您在下一行中所做的。

    当然,以你调用这个函数的方式,它永远不会发生。你这样称呼它:

    store_stuff(&name, &age);
    

    并且&amp; 运算符的计算结果始终为有效的非NULL 指针。


    一般来说,不清楚您所说的“空”是什么意思。指针有一个特殊值NULL,表示“这个指针不指向任何东西”。但这并不意味着“空”,它仍然有一个值:NULL

    strings 的上下文中,empty 具有明确定义的含义。由于 C 中的字符串被定义为以 \0 字节结尾的字符序列,因此 empty 字符串的第一个字符是 \0。所以,假设char *str 是一个字符串,你可以检查一个空字符串,比如

    if (*str == 0)
    

    甚至更短:

    if (!*str)
    

    请注意,如果 strNULL(不指向 any 字符串),这将导致未定义的行为。如果您对此一无所知并且必须检查它是否确实指向一个字符串并且该字符串非空,您可以编写类似

    if (!str || !*str)
    

    这大致相当于 .NET 字符串上的 IsNullOrEmpty() 方法 ...

    【讨论】:

    • Felix 他可能想要 name="ERROR" 但他的问题完全不同。他只是对指针一无所知,他首先需要一本 C 书。
    • 我有时使用if(str) if(!*str) 来检查字符串是否为空,但即使 str != NULL 仍然不能保证它是可解引用的。 (在 if 条件中不使用 {} 也是不好的做法,应该很好地生成警告)。
    猜你喜欢
    • 2013-01-29
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 2017-11-15
    • 2020-05-29
    • 2018-04-02
    • 2016-04-05
    • 2018-01-08
    相关资源
    最近更新 更多