C语言中如何用strtok跳过空白及标点字符提取单词?
解决strtok提取单词时的分隔符问题
核心解决思路:设置正确的分隔符集合
strtok的第二个参数是分隔符字符串,字符串里的每个字符都会被当作单词的分隔边界。你只需要把所有需要过滤的空白字符(空格、换行\n、制表符\t等)和目标标点(,!;.)都塞进这个字符串里就行。
先修正代码里的关键错误
- 缓冲区溢出问题:你定义的
char string[10]长度远小于后面的内容,会直接导致内存溢出,改成char string[] = "..."让编译器自动分配足够空间。 - 分隔符设置错误:把原来的
" "替换成" \n\t,;!.",覆盖所有需要忽略的字符。 - 第一个循环的逻辑bug:原循环用
||导致判断逻辑完全混乱,而且字符比较用了双引号(应该用单引号),实际上用strtok循环提取单词才是正确的姿势。
正确代码示例
#include <stdio.h> #include <string.h> int main() { // 自动分配足够长度的字符串缓冲区 char string[] = "1 2 3, \n4, 5\n 2; 3 is fun 1 2! 3"; char *words[20]; // 提前定义足够的单词存储数组 int count = 0; // 传入包含空白字符和标点的分隔符集合 char *token = strtok(string, " \n\t,;!."); while(token != NULL){ words[count] = token; count++; token = strtok(NULL, " \n\t,;!."); } // 打印提取结果验证 for(int i=0; i<count; i++){ printf("word %d: %s\n", i+1, words[i]); } return 0; }
效果说明
运行这段代码后,会正确提取出1、2、3、4、5、is、fun等所有单词,不会再出现\n4被当成一个整体、3,拆不出3这类问题。
内容的提问来源于stack exchange,提问作者Professor Seemo
相关产品推荐
相关产品推荐

