strtok中token!= NULL的while循环只做一次是为什么
时间: 2023-07-15 21:11:01 浏览: 60
`strtok` 函数的作用是将字符串按照指定的分隔符进行分割,返回分割后的子字符串。在使用 `strtok` 函数时,第一次调用需要传入待分割的字符串和分割符,后续调用只需要传入 NULL 即可。
当 `strtok` 函数第一次被调用时,它会返回字符串中第一个子字符串,并将指针指向下一个子字符串的起始位置。在后续的调用中,函数会从上一次结束的位置继续寻找下一个子字符串。
因此,当 `strtok` 函数的 `token` 不为 NULL 时,它会在第一次调用时返回第一个子字符串,并将指针指向下一个子字符串的起始位置。在第二次调用时,由于 `token` 已经不为 NULL,所以函数会从上一次结束的位置继续寻找下一个子字符串。如果在第二次调用时还需要循环,那么 `strtok` 函数会继续寻找下一个子字符串,直到找到一个不存在的子字符串为止。
因此,如果 `strtok` 函数的 `token` 不为 NULL 的循环只做一次,那么说明字符串中只有一个子字符串符合分割条件。而如果需要对多个子字符串进行分割,则需要多次调用 `strtok` 函数。
相关问题
char *dup = strdup(str.c_str()); char *token = strtok(dup, " "); while (token != NULL) { v.push_back(string(token)); token = strtok(NULL, " "); } free(dup);
这段代码是将一个string类型的str按照空格分割成多个子串,并将这些子串存入一个vector<string>类型的变量v中。具体实现方式是先将str转换为char*类型的指针dup,然后使用strtok函数将dup按照空格分割成多个子串,每个子串使用string类型的构造函数转换为string类型的变量,并将其存入v中。最后使用free函数释放dup指针的内存空间。这段代码需要注意的是dup指针需要手动释放内存空间,否则会造成内存泄漏。
char* token = strtok(header, delimiter); int i = 0; while (token != NULL) { if (i % 2 == 0) { // 键名在偶数位置 strcpy(key_value_list[i / 2].key, token); } else { // 键值在奇数位置 strcpy(key_value_list[i / 2].value, token); } token = strtok(NULL, delimiter); i++; } *num_entries = i / 2;上面代码存在什么问题
这段代码的问题在于,如果 header 字符串中的键值对数目是奇数个,那么最后一对键值对的值将不会被正确地处理。这是因为循环中每处理一次键值对,i 的值就会加 1,而最后循环结束时,i 的值将是键值对的个数,而不是键值对对的个数乘以 2,因此在计算 *num_entries 的值时就会出错。
为了解决这个问题,可以在循环结束后再检查 i 的值是否为偶数,如果不是偶数,那么说明最后一个键名没有对应的键值,此时应该将 *num_entries 的值减一。修改后的代码如下:
```
char* token = strtok(header, delimiter);
int i = 0;
while (token != NULL) {
if (i % 2 == 0) { // 键名在偶数位置
strcpy(key_value_list[i / 2].key, token);
} else { // 键值在奇数位置
strcpy(key_value_list[i / 2].value, token);
}
token = strtok(NULL, delimiter);
i++;
}
if (i % 2 != 0) { // 最后一个键名没有对应的键值
*num_entries = i / 2 - 1;
} else {
*num_entries = i / 2;
}
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)