如何在c中正确测试空字符串

时间:2017-03-11 23:51:46

标签: c string parsing null

我没有在C中看到任何答案,所以我希望我可以从C社区获得肮脏的解释。我有一个char * ptr我正在测试它不是一个空字符串或NULL但我的if语句失败,即使我可以看到该值实际上是一个空字符串。

截图:

enter image description here

守则:

char **strsplit(char *str, const char delims[], size_t *len) {
    char *save, *tok;              /* holds str_tok val btwn calls */
    char **result = '\0';    /* set result to NULL */
    char *tmp = strdup(str); /* leaves original str intact */
    size_t delims_size = strlen(delims);
    size_t count = 0;        /* number of main strings */
    size_t sub_count = 0;    /* number of substrings */
    int i = 0;

    /* get number of delims in str */
    while ((tmp = strstr(tmp, delims)) != NULL) {
        tmp += delims_size;
        count++;
    } count++; /* add one for trailing token */
    tmp = strdup(str);

    save = malloc(sizeof(char) * strlen(str));
    result = malloc(sizeof(char *) * count);

    if (result && save) {
        while ((tok = strstr(tmp, delims)) != NULL) {
            strncpy(save, tmp, (tok - tmp));
            save[(tok - tmp)] = '\0';
            printf("Token extracted: <<%s>>\n", save);
            result[i++] = strdup(save);
            tok += delims_size;
            tmp = tok;
        } /* grab trailing token */
        if (tmp != NULL && tmp[0] != "") {
            result[i++] = strdup(tmp);
            printf("Token extracted: <<%s>>\n", tmp);
        } /* set last ptr to NULL */
        result[i] = '\0';
        *len = count; /* pass num toks */
    }
    else { /* set len to 0 on error */
        *len = 0;
    }
    if (save) free(save);
    return result;
}

实现:

printf("processing client request\n");
size_t *num_tokens = malloc(sizeof(size_t));           /* num of tokens */
size_t *num_sub_tokens = malloc(sizeof(size_t));       /* num of tokens */
char **tokens = strsplit(req, "\r\n", num_tokens);     /* parse it */

我试图在HTTP标题之后获取空行,但是当客户端执行GET请求时,正文是&#34;&#34;并且它没有被我的if语句抓住。使用POST reauest与body中的数据相同的函数会产生如下输出:

(这是我的标准)

Token extracted: <<POST /index.html HTTP/1.0>>
Token extracted: <<Host: 0.0.0.0>>
Token extracted: <<Content-Length: 1053>>
Token extracted: <<>>
Token extracted: <<"hello world">>

GET请求不应该有额外的尾随令牌:

(GET request stdout)

processing client request
Token extracted: <<GET index.html HTTP/1.0>>
Token extracted: <<Host: 0.0.0.0>>
Token extracted: <<>>
Token extracted: <<>>

这会在解析时导致问题,尽管我可能能够提出一个诙谐的解决方案,例如在GET请求上检查第一个null然后用查询字符串替换下一个标记,如果不存在则替换为NULL。每个人都对此有什么看法?

编辑:添加完整功能和实现调用以使其更清晰

1 个答案:

答案 0 :(得分:0)

正如Brandon大卫提到的那样,将字符串的第一个元素与NULL或测试长度进行比较,以确保字符串包含超过0个字符,完美无缺!他们发布的代码在以下方面重申:

将第一个elem与null进行比较:

if (tmp[0] != '\0') { printf("string is not empty"); }

检查字符串的长度:

if (tmp && strlen(tmp)) { printf("string is not empty"); }