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

C语言递归字符串行提取函数异常求助:无法提取全部行

C递归提取字符串行的问题修复

问题分析

你的代码存在三个核心问题导致无法正常输出所有行:

  • 终止条件不合理:固定判断num_of_line == 3,只能处理3行,而输入有4行,最后一行不会被处理。
  • 行起始位置计算错误:actual_line += count + 1会累加错误偏移量,导致后续行起始位置跳越,直接跳过第三行aa。
  • 未处理无换行符的最后一行:处理到字符串末尾时,因没有'\n',while循环会越界访问内存,引发未定义行为。

修复后的代码

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int safe_line(char* input, int end_of_line, int num_of_line, int num_sum_safe)
{
    char temp_line[24];
    int count = end_of_line;
    int actual_line;
    int temp_num_line = num_of_line + 1;

    // 终止条件:到达字符串末尾
    if (input[end_of_line] == '\0')
    {
        return num_sum_safe;
    }

    // 提取当前行:直到遇到换行符或字符串结束
    int idx = 0;
    while (input[count] != '\n' && input[count] != '\0')
    {   
        temp_line[idx++] = input[count++];
    }
    temp_line[idx] = '\0';

    // 计算下一行起始位置:如果当前是换行符,跳过它
    actual_line = (input[count] == '\n') ? count + 1 : count;

    printf("%s\n", temp_line);

    return safe_line(input, actual_line, temp_num_line, 0);
}

int main()
{
    // 让编译器自动计算数组大小,避免越界
    char input[] = "n\natt\naa\na as";
    safe_line(input, 0, 0, 0);
}

关键修改说明

  1. 调整终止条件:改为判断当前起始位置是否为字符串末尾'\0',无论多少行都能处理。
  2. 修正行起始位置计算:直接根据当前是否为换行符设置下一行起始位置,避免累加错误。
  3. 处理无换行符的最后一行:循环条件加入input[count] != '\0',防止越界访问。
  4. 简化索引操作:用idx单独记录temp_line的索引,避免count - actual_line的复杂计算,更清晰不易错。
  5. 优化input数组定义:去掉固定长度,让编译器自动分配足够空间,避免数组越界。

输出结果

修复后运行代码,将得到预期输出:

n
att
aa
a as

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:13:11