如何检查 C 字符串是否为空

我正在用 C 编写一个非常小的程序,它需要检查某个字符串是否为空。为了回答这个问题,我简化了我的代码:

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


int main() {
char url[63] = {'\0'};
do {
printf("Enter a URL: ");
scanf("%s", url);
printf("%s", url);
} while (/*what should I put in here?*/);


return(0);
}

我希望程序停止循环,如果用户只是按回车,而没有输入任何东西。

284707 次浏览

你可以这样试试:-

if (string[0] == '\0') {
}

在你的情况下,它可以像:-

do {
...
} while (url[0] != '\0')

;

如果要检查字符串是否为空:

if (str[0] == '\0')
{
// your code here
}

strlen(url)

返回字符串的长度。它对所有字符进行计数,直到找到空字节为止。对于您的情况,将其与0进行检查。

或者手动检查:

*url == '\0'

如果第一个字符恰好是 '\0',那么就有一个空字符串。

你应该这么做:

do {
/*
*   Resetting first character before getting input.
*/
url[0] = '\0';


// code
} while (url[0] != '\0');

因为 C 样式的字符串总是以空字符(\0)结束,所以您可以通过写入来检查字符串是否为空

do {
...
} while (url[0] != '\0');

或者,你也可以使用 strcmp函数,这个函数有点过分,但可能更容易阅读:

do {
...
} while (strcmp(url, ""));

请注意,如果字符串不同,则 strcmp返回非零值,如果字符串相同,则返回0,因此这个循环将继续循环,直到字符串为非空。

希望这个能帮上忙!

您可以检查返回值从 scanf。这个代码将只是坐在那里,直到它收到一个字符串。

int a;


do {
// other code
a = scanf("%s", url);


} while (a <= 0);

通常来说,在这里很难得到一个空字符串,因为 %s忽略了空格(空格、制表符、换行符) ... ... 但是无论如何,scanf()实际上返回了成功匹配的数量... ..。

来自手册页:

成功匹配和分配的输入项的数量,可以少于提供的数量,甚至在早期匹配失败的情况下为零。

因此,如果他们设法得到一个空字符串(例如 ctrl+z) ,你可以只检查返回结果。

int count = 0;
do {
...
count = scanf("%62s", url);  // You should check return values and limit the
// input length
...
} while (count <= 0)

注意,您必须检查小于,因为在我给出的示例中,您将返回 -1,同样在手册页中有详细说明:

如果在第一次成功转换或发生匹配失败之前到达输入末尾,则返回值 EOF。如果发生读取错误,也将返回 EOF,在这种情况下,将设置流的错误指示符(请参阅 ferror (3)) ,并设置 errno 指示错误。

首先用 fgets()代替 scanf()..。

do {
if (!fgets(url, sizeof url, stdin)) /* error */;
/* ... */
} while (*url != '\n');

使用 strtok () ,只需一行代码即可完成: “ if (strtok (s,“ t”) = = NULL)”。 例如:

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


int is_whitespace(char *s) {
if (strtok(s," \t")==NULL) {
return 1;
} else {
return 0;
}
}


void demo(void) {
char s1[128];
char s2[128];
strcpy(s1,"   abc  \t ");
strcpy(s2,"    \t   ");
printf("s1 = \"%s\"\n", s1);
printf("s2 = \"%s\"\n", s2);
printf("is_whitespace(s1)=%d\n",is_whitespace(s1));
printf("is_whitespace(s2)=%d\n",is_whitespace(s2));
}


int main() {
char url[63] = {'\0'};
do {
printf("Enter a URL: ");
scanf("%s", url);
printf("url='%s'\n", url);
} while (is_whitespace(url));
return 0;
}

最简单的方法是:

do {
// Something
} while (*url);

基本上,*url会在数组的第一个位置返回 char; 因为 C 字符串是以 null 结尾的,如果字符串是空的,那么它的第一个位置就是字符 '\0',它的 ASCII 值是 0; 因为 C 逻辑语句把每个零值都当作 false,所以当字符串的第一个位置是非 null 时,这个循环将继续运行,也就是说,当字符串不是空的时候。

如果你想更好地理解这一点,推荐阅读:

我写下了这个宏

#define IS_EMPTY_STR(X) ( (1 / (sizeof(X[0]) == 1))/*type check*/ && !(X[0])/*content check*/)

就是这样

while (! IS_EMPTY_STR(url));

这个宏的好处是它是类型安全的。如果不放入指向 char 的指针,就会出现编译错误。

很简单。 检查 while 条件中的字符串空条件。

  1. 可以使用 strlen 函数检查字符串长度。

    #include<stdio.h>
    #include <string.h>
    
    
    int main()
    {
    char url[63] = {'\0'};
    do
    {
    printf("Enter a URL: ");
    scanf("%s", url);
    printf("%s", url);
    } while (strlen(url)<=0);
    return(0);
    }
    
  2. 检查第一个字符是’0’

    #include <stdio.h>
    #include <string.h>
    
    
    int main()
    {
    char url[63] = {'\0'};
    
    
    do
    {
    printf("Enter a URL: ");
    scanf("%s", url);
    printf("%s", url);
    } while (url[0]=='\0');
    
    
    return(0);
    }
    

供你参考:

C 数组:
Https://www.javatpoint.com/c-array
Https://scholarsoul.com/arrays-in-c/

C 字符串:
Https://www.programiz.com/c-programming/c-strings
Https://scholarsoul.com/string-in-c/
Https://en.wikipedia.org/wiki/c_string_handling

核实及摘要:

  • 检查 C 字符串是空的
    • url[0] == '\0'
    • strlen(url) == 0
    • strcmp(url, "") == 0
  • 检查 C 字符串不是空的
    • url[0] != '\0'
    • strlen(url) > 0
    • strcmp(url, "") != 0