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

时间:2013-03-18 19:24:24

标签: c string

我在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而不输入任何内容,我希望程序停止循环。

12 个答案:

答案 0 :(得分:51)

由于C风格的字符串总是以空字符(\0)终止,因此您可以通过编写

来检查字符串是否为空
do {
   ...
} while (url[0] != '\0');

或者,你可以使用strcmp函数,这是一种过度杀伤但可能更容易理解的内容:

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

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

希望这有帮助!

答案 1 :(得分:13)

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

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

答案 2 :(得分:7)

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

这是你应该做的:

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

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

答案 3 :(得分: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)

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

  

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

答案 4 :(得分:3)

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

int a;

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

} while (a <= 0);

答案 5 :(得分:2)

您可以尝试这样: -

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

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

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

答案 6 :(得分:2)

strlen(url)

返回字符串的长度。它会计算所有字符,直到找到空字节。在您的情况下,请将其与0进行核对。

或者只需手动检查:

*url == '\0'

答案 7 :(得分:2)

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

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

答案 8 :(得分:0)

最简单的方法是:

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

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

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

答案 9 :(得分:0)

我写下了这个宏

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

原来如此

while (! IS_EMPTY_STR(url));

此宏的好处在于它是类型安全的。如果将字符放置到指向char的指针以外的其他位置,则会出现编译错误。

答案 10 :(得分:0)

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

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

    {
       "html_attributions" : [],
       "result" : {
          "address_components" : [
             {
                "long_name" : "Washington",
                "short_name" : "WA",
                "types" : [ "administrative_area_level_1", "political" ]
             },
             {
                "long_name" : "United States",
                "short_name" : "US",
                "types" : [ "country", "political" ]
             }
          ],
          "adr_address" : "\u003cspan class=\"region\"\u003eWashington\u003c/span\u003e, \u003cspan class=\"country-name\"\u003eUSA\u003c/span\u003e",
          "formatted_address" : "Washington, USA",
          "geometry" : {
             "location" : {
                "lat" : 47.7510741,
                "lng" : -120.7401386
             },
             "viewport" : {
                "northeast" : {
                   "lat" : 49.00256875707851,
                   "lng" : -116.9155800245149
                },
                "southwest" : {
                   "lat" : 45.54354101516995,
                   "lng" : -124.8489739457119
                }
             }
          },
          "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/v1/png_71/geocode-71.png",
          "name" : "Washington",
          "photos" : [],
          "place_id" : "ChIJ-bDD5__lhVQRuvNfbGh4QpQ",
          "reference" : "ChIJ-bDD5__lhVQRuvNfbGh4QpQ",
          "types" : [ "administrative_area_level_1", "political" ],
          "url" : "https://maps.google.com/?q=Washington,+USA&ftid=0x5485e5ffe7c3b0f9:0x944278686c5ff3ba",
          "utc_offset" : -480,
          "website" : "http://www.access.wa.gov/"
       },
       "status" : "OK"
    }
    
  2. 检查第一个字符为'\ 0'

    function MyComponent(props) {
      const { dataArr } = props;
      [ownDataArr, setOwnDataArr] = useState([...dataArr]);
      
      // add useEffect wich depend on dataArr changing, 
      // because initial state is memoized by useState
      useEffect(() => setOwnDataArr(dataArr), [dataArr])
      return (
        // ownDataArr is used here
      );
    }
    

供您参考:

C数组:
https://maps.googleapis.com/maps/api/place/details/json?place_id=ChIJ-bDD5__lhVQRuvNfbGh4QpQ&language=en&key=YOUR_API_KEY
https://www.javatpoint.com/c-array

C字符串:
https://scholarsoul.com/arrays-in-c/
https://www.programiz.com/c-programming/c-strings
https://scholarsoul.com/string-in-c/

答案 11 :(得分:-1)

使用strtok(),它可以在一行中完成:&#34; if(strtok(s,&#34; \ t&#34;)== NULL)&#34;。 例如:

#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;
}
相关问题