gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:35:23 25 4
gpt4 key购买 nike

我没有在 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 header 后面获取空行,但是当客户端执行 GET 请求时,正文是“”并且它不会被我的 if 语句捕获。使用 POST reauest 与正文中的数据相同的函数会产生如下输出:

(这是我的标准输出)

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 请求不应在此处包含额外的尾随 token :

(获取请求标准输出)

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 替换。大家对此有何看法?

编辑:添加了完整的函数和实现调用以使其更加清晰

最佳答案

正如 Brandon 和 David 提到的,将字符串的第一个元素与 NULL 进行比较或测试长度以确保字符串包含超过 0 个字符,效果完美!为了方便起见,他们发布的代码在下面重申:

将第一个元素与 null 进行比较:

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

检查字符串的长度:

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

关于c - 如何正确测试c中的空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42742065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com