【问题标题】:How to check if String is empty in C如何在C中检查String是否为空
【发布时间】:2014-10-28 13:19:01
【问题描述】:

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

问题是即使字符串是空的,void 函数也会打印一条消息/做一些事情。 所以如果全局变量是空的,它只会打印“消息是:” 如果字符串有字符,我只想做一些事情。

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

// 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);
}

感谢您的帮助

【问题讨论】:

  • 你试过了吗?
  • @juanchopanza 我们确定 strln 不会在这里返回 30 吗?
  • @4rlekin 那么字符串不会为空。我假设一个以空值结尾的字符串。否则问题就不同了。
  • @juanchopanza 我的意思是,如果 scanf() 不起作用,未初始化的数组将包含 30 * sizeof(char) 字节的垃圾 AFAIK 也从 scanf() 返回表示失败/成功

标签: c string if-statement printf


【解决方案1】:

简单的方法是这样的:

if (msg[0])
    printf("message: %s", msg);

如果在以后某个日期,msg 是一个指针,您首先要确保它不是一个 NULL 指针。

if (msg && msg[0])
    printf("message: %s", msg);

要演示的测试程序:

#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);
}

在我的机器上输出是:

字符串是我

【讨论】:

  • 我觉得msg &amp;&amp; msg[0]msg[0]没有区别??
  • 如果定义为char *msg,区别在于msg[0]指的是第一个字符,msg指的是指针本身。
  • 您始终可以将msg 写为msg[0],因为它将被视为*(msg+0),这与msg 完全相同。数组名只是一个常量指针。那么它有什么不同,在这里
  • @AmitSharma 没有。 msg 计算为第一个 char 的地址。 msg[0]*(msg+0) 相同,但不是 msgmsg &amp;&amp; msg[0] 在指针为:非空时为真。引用具有非零值的 char。它也是短路的,所以它不会尝试取消引用空指针。
  • @AmitSharma:我在答案中添加了一个愚蠢的小测试程序。试试看。
【解决方案2】:

C 中的字符串表示为字符数组,以一个值为零的字符结尾(通常写为'\0')。字符串的长度是零之前的字符数。

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

可以这样检查:

if(msg[0] != '\0')
{
  /* string isn't empty! */
}

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

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

【讨论】:

  • +1 用于提及 scanf() 的返回。 (没有其他人认为这是一个问题。)
  • @ryyker 没有人曾经在这附近。
  • 还可以注意到,使用全局变量也可能不是一个好主意。不过,似乎与所提出的问题正交,所以我没有将其包含在我的答案中。
  • @Edward - 特别适用于嵌入式,但在嵌入式之外,有些地方全局变量很有用。例如。 extern 范围结构数组提供了简单性,并且在内存如此便宜的情况下成本非常实惠。 (例如,对于在桌面上运行的应用程序)
  • @ryyker:虽然在某些情况下可能需要全局变量,但这肯定不是其中之一。
【解决方案3】:

这应该适合你:

只有长于 0 的消息才会被打印。

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

void timer() {

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

    if(strlen(msg) != 0)
        printf("message: %s", msg);
}

int main() {

    timer();

    return 0; 
}

【讨论】:

  • 这会报错。你必须包括#include&lt;string.h&gt;
  • 不知道为什么没人推荐检查scanf的返回值?如果失败,msg数组可能还包含垃圾,字符串长度不一定为0。
  • 难道&amp; 不需要从scanf 中删除吗?
【解决方案4】:

以下是我找到(并且可以想到的)检查字符串是否为空的所有方法。按效率排序。

  • msg[0] == '\0'
  • strlen(msg) == 0
  • !strcmp(msg, "")

只有当用户以某种方式避免输入(例如使用 Ctrl+Z)或出现错误时才会发生这种情况

  • scanf("%s", &amp;msg) &lt;= 0

【讨论】:

    【解决方案5】:

    我认为一个快速简单的解决方案是在string.h 中使用strlen() 来检查字符串的长度。如果为 0 则为空。

    例如

    // Check string is NOT empty.
    if (strlen(current_word) > 0)
                {
                    printf("%s %lu", current_word, strlen(current_word));
                    strcpy(current_word, "");
                    print_line();
                }
    

    【讨论】:

      【解决方案6】:
      1. 使用 Strlen() 函数。
      2. 使用 strcmp() 与 NULL 字符串比较;
      3. 检查第一个字符是否等于“\0”。
      4. 如果使用 scanf 输入字符串,则检查 scanf() 函数的返回值

      第一种方法:

      char msg[30];

      scanf("%s", &amp;msg);

      void timer(void) {

      if(strlen(msg)&gt;0)

      printf("message: %s", msg);

      }

      第二种方法:

      char msg[30];

      scanf("%s", &amp;msg);

      void timer(void) {

      if(strcmp(msg,"")!=0)

      printf("message: %s", msg);

      }

      第三种方法:

      char msg[30];

      scanf("%s", &amp;msg);

      void timer(void) {

      if(msg[0]!='\0')

      printf("message: %s", msg);

      }

      第四种方法:

      char msg[30];

      int rv=scanf("%s", &amp;msg);

      void timer(void) {

      if(rv&gt;0)

      printf("message: %s", msg);

      }

      供你参考c字符串

      https://www.programiz.com/c-programming/c-strings

      https://www.geeksforgeeks.org/strings-in-c-2/

      https://scholarsoul.com/string-in-c/

      https://www.guru99.com/c-strings.html

      【讨论】:

        【解决方案7】:

        好的,你可以试试这个:

        char msg[30];
        scanf("%s",&msg);
        
        void timer(void)
        {
            //i want to only print if there is a message
            if(!msg.length == 0 )
                printf("message: %s", msg);
        }
        

        `

        【讨论】:

          猜你喜欢
          • 2013-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多