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

如何将整句字符串转换为每行对应一个单词的二维数组?

需求与现有代码分析

我正在完成大学作业,这段代码是作业的一部分,想找到可复用的高效实现方式,并完全理解其中逻辑。我是编程新手,还没建立这类问题的思维逻辑,目前靠白板模拟运行来辅助理解。

我要实现的功能是:把输入字符串按空格拆分,每个子串放到二维数组的一行里。尝试用嵌套循环实现,检测到空格就切换到新行继续读取,但不确定写法是否正确,希望参考其他实现方式。

变量母语命名对应解释

  • 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;
              }
        }
   }
}

现有代码的问题

  1. 逻辑运算错误:rnk[j] != ' ' & rnk[j] != NULL 中的&是位运算符,应该用&&逻辑与;另外C语言中字符串结束符是'\0',不是指针空值NULL。
  2. 二维数组赋值错误:novi[i][j] = rnk[j] 用了输入字符串的全局索引j,会导致每行字符从大下标开始存储,浪费空间且不符合二维数组每行从下标0开始的常规用法。
  3. 循环终止条件不严谨:内层循环brojac < 1遇到第一个空格就停止,若存在连续空格会生成空行。
  4. 返回值缺失:函数声明返回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是安全的字符串复制函数,避免数组越界问题。

新手理解建议

  1. 白板模拟优化:继续用白板模拟时,把每个变量的实时值(比如row、col、当前字符)一步步记录,对比代码执行流程,能快速理清逻辑。
  2. 边界测试:测试时覆盖特殊场景,比如开头/结尾有空格、连续空格、超长单词、空字符串等,验证代码的鲁棒性。
  3. 熟悉标准库:多了解C标准库的字符串处理函数(如strlen、strtok、strncpy),这些都是经过优化的高效实现,能减少重复造轮子的工作量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:35:24