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)
在我的机器上输出是:
字符串是我
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设置为空字符串.