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

C语言不使用strtok()实现字符串拆分逐词打印的实现问题

问题分析

你的代码存在以下核心错误:

  • 变量i未初始化:定义int i;后没有赋值为0,i是内存随机值,直接访问inputString[i]会发生数组越界,导致程序行为异常。
  • 单词存储逻辑错误:testing[inputString[i]]++;是将字符的ASCII码作为数组下标进行计数,完全不是将字符写入数组存储单词的逻辑。
  • 内部循环未判断字符串结束符:内层while(inputString[i] != ' ')没有判断'\0',遍历到字符串末尾没有空格时会持续越界访问内存。
  • 字符串无结束符:C语言中用%s打印的字符串必须以'\0'结尾,你的testing数组未补充结束符,打印会输出乱码或触发异常。
  • 未输出换行符:需求要求每个单词单独占一行,printf语句没有加\n。
  • 未处理连续空格:如果输入存在多个连续空格,原逻辑会打印空行,不符合需求。

正确实现

以下实现完全使用基础语法,未用到动态内存分配相关函数:

#include <stdio.h>

#define MAX_WORD 100

void printfTokens(char *inputString) {
    int i = 0; // 遍历输入字符串的下标,必须初始化
    while (inputString[i] != '\0') {
        // 跳过开头的连续空格
        while (inputString[i] == ' ') {
            i++;
            if (inputString[i] == '\0') {
                return; // 到字符串末尾直接结束
            }
        }
        char testing[MAX_WORD];
        int j = 0; // 存储当前单词的下标
        // 读取所有非空格字符,直到遇到空格或字符串结束符
        while (inputString[i] != ' ' && inputString[i] != '\0') {
            testing[j++] = inputString[i];
            i++;
        }
        testing[j] = '\0'; // 补充字符串结束符
        printf("%s\n", testing); // 打印单词加换行
    }
}

int main() {
    printfTokens("TESTING ONE! TWO! THREE!");
    printfTokens("Hello from other side!");
    return 0;
}

运行输出

TESTING
ONE!
TWO!
THREE!
Hello
from
other
side!

内容的提问来源于stack exchange,提问作者Muzzlet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:48:00