我没有在C中看到任何答案,所以我希望我可以从C社区获得肮脏的解释。我有一个char * ptr我正在测试它不是一个空字符串或NULL但我的if语句失败,即使我可以看到该值实际上是一个空字符串。
截图:
守则:
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。每个人都对此有什么看法?
编辑:添加完整功能和实现调用以使其更清晰
答案 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"); }