如何检查C中的String是否为空

use*_*890 3 c string printf if-statement

我有一个void函数,它从全局变量中获取字符串并打印它们.

问题是即使字符串是empy,void函数也会打印一条消息/做东西.因此,如果全局变量为empt,则只打印"message is:"我只想在字符串中包含字符时执行某些操作.

我想要做的是检查字符串是否为空,然后打印一条消息.

// global variable

char msg[30];
scanf("%s", &msg);

void timer(void) {
    //i want to only print if there is a message
    printf("message: %s", msg);
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

Edw*_*ard 13

简单的方法是这样的:

if (msg[0])
    printf("message: %s", msg);
Run Code Online (Sandbox Code Playgroud)

如果稍后某个时候msg是指针,那么首先要确保它不是NULL指针.

if (msg && msg[0])
    printf("message: %s", msg);
Run Code Online (Sandbox Code Playgroud)

一个测试程序来演示:

#include <stdio.h>
#include <stdlib.h>

char *msg;

void test() {
    if (msg && msg[0])
        printf("string is %s\n", msg);
}

int main()
{
    msg = NULL;
    test();
    msg = calloc(10, 1);
    test();
    msg[0] = 'm';
    msg[1] = 'e';
    test();
    free(msg);
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上输出是:

字符串是我

  • 如果它被定义为`char*msg`,区别在于`msg [0]`指的是第一个字符,`msg`指的是指针本身. (2认同)

unw*_*ind 7

C中的字符串表示为字符数组,由值为零的字符(通常写为'\0')终止.字符串的长度是零之前的字符数.

因此,如果数组中的第一个字符为零,则字符串为空,因为根据定义,在零之前没有字符.

可以像这样检查:

if(msg[0] != '\0')
{
  /* string isn't empty! */
}
Run Code Online (Sandbox Code Playgroud)

这是非常明确的代码,更短if(msg[0])if(*msg)具有完全相同的语义,但可能稍微难以阅读.这主要是个人风格的问题.

但请注意,在你的情况下,当您使用scanf()读入msg,你应该检查返回值scanf()检查的内容之前msg.scanf()失败是完全可能的,然后你不能依赖于msg设置为空字符串.