strtok_s与strtok_r
时间: 2023-11-15 18:56:33 浏览: 174
strtok_s和strtok_r都是用来分割字符串的函数,但是它们的实现略有不同。
strtok_s是C11标准中新增的安全版本,它在使用时需要传入一个指向保存分割状态的指针,以保证线程安全。同时,它还需要传入一个分隔符字符串和一个指向要分割的字符串的指针。使用时,它会将第一次调用时传入的字符串分割成若干个子串,并返回第一个子串的指针。之后每次调用时,传入NULL作为第一个参数,函数会继续从上一次结束的位置开始分割。
strtok_r是POSIX标准中定义的函数,它与strtok_s类似,但是它需要传入一个指向保存分割状态的指针的指针,以保证线程安全。同时,它还需要传入一个分隔符字符串和一个指向要分割的字符串的指针。使用时,它会将第一次调用时传入的字符串分割成若干个子串,并返回第一个子串的指针。之后每次调用时,传入NULL作为第一个参数,函数会继续从上一次结束的位置开始分割。
相关问题
strtok_s函数参数
引用提到,strtok_s函数是一个可重入函数(线程安全函数),用于字符串分割。它的参数包括一个指向待分割字符串的指针、分隔符字符串以及一个指向保存剩余字符的地址的指针。具体的函数原型是:
char *strtok_s(char *str, const char *delim, char **ptr)
其中,str是待分割的字符串,delim是分隔符字符串,ptr是一个指向指针的指针,用于保存剩余字符的地址。在初始调用时,需要将str指向待分割的字符串,并将ptr设置为NULL。后续调用时,将str设置为NULL,ptr将保存上一次分割的剩余字符的地址。每次调用strtok_s函数后,它会返回分割出的子字符串,并将ptr更新为下一次分割的剩余字符的地址。当无法找到更多分割位置时,strtok_s函数会返回NULL,指示分割结束。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [C strtok strtok_s 函数说明 按分隔符分解字符串](https://blog.csdn.net/luoxutimberjack/article/details/130645509)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *2* [strtok函数和可重入函数strtrok_s、strtok_r的使用和注意事项](https://blog.csdn.net/weixin_53472334/article/details/128022929)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *3* [strtok和strtok_s函数使用说明](https://blog.csdn.net/qq_42287144/article/details/127703574)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
[ .reference_list ]
strtok_s 的详细使用方法
引用\[1\]: strtok_r是C语言中的一个函数,用于将字符串分割成多个子字符串。它的原型是char *strtok_r(char *__str, const char *__sep, char **__lasts),其中__str是要分割的字符串,__sep是分隔符,__lasts是一个指向指针的指针,用于保存下一次要分割字符串的指针。与strtok不同的是,strtok_r是线程安全的,可以在多线程环境中使用。使用strtok_r的方法与strtok类似,只是需要传入额外的__lasts参数来保存下一次要分割字符串的指针。引用\[2\]:下面是一个使用strtok_r的例子: char str\[\] = "boy,Lilei|girl,Lili"; char *savP, *savP1; char *p = strtok_r(str, "|", &savP); while(p != nullptr){ char *p1 = strtok_r(p, ",", &savP1); while (p1 != nullptr){ cout << p1 << endl; p1 = strtok_r(nullptr, ",", &savP1); } p = strtok_r(nullptr, "|", &savP); } 输出: boy Lilei girl Lili 引用\[3\]:至于strtok_s,它是C11标准中引入的一个函数,用于字符串分割。与strtok_r类似,strtok_s也是线程安全的。它的原型是char *strtok_s(char *__restrict__ __str, const char *__restrict__ __sep, char **__restrict__ __lasts),其中__str是要分割的字符串,__sep是分隔符,__lasts是一个指向指针的指针,用于保存下一次要分割字符串的指针。使用方法与strtok_r类似,只是函数名和参数名称有所不同。
#### 引用[.reference_title]
- *1* *2* *3* [strok、strtok_r和strtok_s](https://blog.csdn.net/zhangsj1007/article/details/81365732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文