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
相关产品推荐
相关产品推荐

