69

我正在用 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);
}

如果用户只是按 Enter 键而不输入任何内容,我希望程序停止循环。

4

13 回答 13

79

由于 C 风格的字符串总是以空字符 ( \0) 结尾,因此您可以通过编写来检查字符串是否为空

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

或者,您可以使用该strcmp功能,这有点过头但可能更易于阅读:

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

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

希望这可以帮助!

于 2013-03-18T19:27:45.433 回答
22

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

if (str[0] == '\0')
{
    // your code here
}
于 2013-03-18T19:26:26.670 回答
7

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

这是你应该做的:

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

    // code
} while (url[0] != '\0');
于 2013-03-18T19:26:58.273 回答
4

%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)

请注意,您必须检查 less ,因为在我给出的示例中,您会返回-1,在手册页中再次详细说明:

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

于 2013-03-18T19:31:44.447 回答
3

strlen(url)

返回字符串的长度。它计算所有字符,直到找到一个空字节。在你的情况下,检查它是否为 0。

或者只是手动检查它:

*url == '\0'
于 2013-03-18T19:26:54.680 回答
3

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

int a;

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

} while (a <= 0);
于 2013-03-18T19:30:16.580 回答
2

你可以这样尝试:-

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

在你的情况下,它可能是: -

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

;

于 2013-03-18T19:26:10.920 回答
2

首先替换scanf()fgets()...

do {
    if (!fgets(url, sizeof url, stdin)) /* error */;
    /* ... */
} while (*url != '\n');
于 2013-03-18T19:33:43.087 回答
2

最短的方法是:

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

基本上,*url将返回数组中第一个位置的字符;由于 C 字符串以空值结尾,如果字符串为空,则其第一个位置将是字符'\0',其 ASCII 值为0; 由于 C 逻辑语句将每个零值视为false,因此当字符串的第一个位置非空,即字符串不为空时,此循环将继续进行。

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

于 2018-05-05T10:43:41.523 回答
1

我已经写下了这个宏

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

所以它会是

while (! IS_EMPTY_STR(url));

这个宏的好处是它是类型安全的。如果放入除指向 char 的指针之外的其他内容,则会出现编译错误。

于 2019-09-11T08:40:07.730 回答
0

这很简单。在 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

于 2020-12-07T15:36:29.487 回答
0

验证和总结:

  • 检查 C 字符串是否为空
    • url[0] == '\0'
    • strlen(url) == 0
    • strcmp(url, "") == 0
  • 检查 C 字符串不为空
    • url[0] != '\0'
    • strlen(url) > 0
    • strcmp(url, "") != 0
于 2021-11-09T09:35:28.820 回答
-1

使用 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;
}
于 2014-04-22T06:07:57.633 回答