You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中如何用strtok跳过空白及标点字符提取单词?

解决strtok提取单词时的分隔符问题

核心解决思路:设置正确的分隔符集合

strtok的第二个参数是分隔符字符串,字符串里的每个字符都会被当作单词的分隔边界。你只需要把所有需要过滤的空白字符(空格、换行\n、制表符\t等)和目标标点(,!;.)都塞进这个字符串里就行。

先修正代码里的关键错误

  1. 缓冲区溢出问题:你定义的char string[10]长度远小于后面的内容,会直接导致内存溢出,改成char string[] = "..."让编译器自动分配足够空间。
  2. 分隔符设置错误:把原来的" "替换成" \n\t,;!.",覆盖所有需要忽略的字符。
  3. 第一个循环的逻辑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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:05:32