如何将整句字符串转换为每行对应一个单词的二维数组?
需求与现有代码分析
我正在完成大学作业,这段代码是作业的一部分,想找到可复用的高效实现方式,并完全理解其中逻辑。我是编程新手,还没建立这类问题的思维逻辑,目前靠白板模拟运行来辅助理解。
我要实现的功能是:把输入字符串按空格拆分,每个子串放到二维数组的一行里。尝试用嵌套循环实现,检测到空格就切换到新行继续读取,但不确定写法是否正确,希望参考其他实现方式。
变量母语命名对应解释
- brojac:计数器
- br_beline:空格数
- pamcenje:记录j的上次位置,让i递增后j从该位置开始
- rnk:输入字符串的字符数组
- novi:目标二维数组
我的现有代码
int orf(char rnk[]) { int i,j; int brojac = 0; int pamcenje = 0; char novi[MAKS][MAKS] = {}; //MAKS 为 100 int br_beline = brojac_belina(rnk); for (i = 0; i <= br_beline; ++i, brojac = 0){ for (j = pamcenje; brojac < 1; ++j, ++pamcenje){ if (rnk[j] != ' ' & rnk[j] != NULL) { novi[i][j] = rnk[j]; pamcenje = j; } else{ ++brojac; pamcenje = j; } } } }
现有代码的问题
- 逻辑运算错误:
rnk[j] != ' ' & rnk[j] != NULL中的&是位运算符,应该用&&逻辑与;另外C语言中字符串结束符是'\0',不是指针空值NULL。 - 二维数组赋值错误:
novi[i][j] = rnk[j]用了输入字符串的全局索引j,会导致每行字符从大下标开始存储,浪费空间且不符合二维数组每行从下标0开始的常规用法。 - 循环终止条件不严谨:内层循环
brojac < 1遇到第一个空格就停止,若存在连续空格会生成空行。 - 返回值缺失:函数声明返回
int,但无return语句,会触发未定义行为。
高效可复用的实现方式
提供两种C语言中拆分字符串到二维数组的经典写法,适合新手理解和复用:
思路1:逐字符遍历拆分(手动实现,适合理解底层逻辑)
#include <string.h> #define MAKS 100 int split_string_to_2d(char rnk[], char novi[MAKS][MAKS]) { int row = 0; int col = 0; int len = strlen(rnk); for (int i = 0; i <= len; ++i) { // 遇到空格或字符串结束符,结束当前行 if (rnk[i] == ' ' || rnk[i] == '\0') { // 避免连续空格生成空行 if (col > 0) { novi[row][col] = '\0'; // 给当前行添加字符串结束符 row++; col = 0; } } else { // 非空格字符存入当前行对应列 novi[row][col] = rnk[i]; col++; // 防止单行字符超过数组长度(留位置存结束符) if (col >= MAKS - 1) { novi[row][col] = '\0'; row++; col = 0; } } } return row; // 返回拆分后的有效行数 }
逻辑拆解:
- 用
row记录二维数组当前行号,col记录当前行的字符偏移量。 - 遍历输入字符串,遇到空格/结束符时给当前行补结束符并切换到下一行;连续空格时因
col为0,不会生成空行。 - 加入单行长度限制,避免数组越界。
- 返回有效行数,方便后续操作二维数组。
思路2:用strtok函数拆分(简洁高效,复用性强)
strtok是C标准库专门用于字符串拆分的函数,适合按分隔符拆分的场景:
#include <string.h> #define MAKS 100 int split_string_to_2d(char rnk[], char novi[MAKS][MAKS]) { int row = 0; // 第一次调用strtok,传入原字符串和分隔符(空格) char *token = strtok(rnk, " "); while (token != NULL && row < MAKS) { // 安全复制子串到二维数组当前行 strncpy(novi[row], token, MAKS - 1); novi[row][MAKS - 1] = '\0'; // 强制补结束符,防止越界 row++; // 后续调用传NULL,继续拆分原字符串剩余部分 token = strtok(NULL, " "); } return row; }
逻辑拆解:
strtok会按指定分隔符把输入字符串拆分成多个子串(token),每次调用返回一个子串的指针。- 首次调用传原字符串,之后传
NULL即可继续拆分剩余内容。 strncpy是安全的字符串复制函数,避免数组越界问题。
新手理解建议
- 白板模拟优化:继续用白板模拟时,把每个变量的实时值(比如row、col、当前字符)一步步记录,对比代码执行流程,能快速理清逻辑。
- 边界测试:测试时覆盖特殊场景,比如开头/结尾有空格、连续空格、超长单词、空字符串等,验证代码的鲁棒性。
- 熟悉标准库:多了解C标准库的字符串处理函数(如
strlen、strtok、strncpy),这些都是经过优化的高效实现,能减少重复造轮子的工作量。
内容的提问来源于stack exchange,提问作者Igor Stojanovic
相关产品推荐
相关产品推荐

