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); }
关键修改说明
- 调整终止条件:改为判断当前起始位置是否为字符串末尾
'\0',无论多少行都能处理。 - 修正行起始位置计算:直接根据当前是否为换行符设置下一行起始位置,避免累加错误。
- 处理无换行符的最后一行:循环条件加入
input[count] != '\0',防止越界访问。 - 简化索引操作:用
idx单独记录temp_line的索引,避免count - actual_line的复杂计算,更清晰不易错。 - 优化input数组定义:去掉固定长度,让编译器自动分配足够空间,避免数组越界。
输出结果
修复后运行代码,将得到预期输出:
n att aa a as
内容的提问来源于stack exchange,提问作者Yuki
相关产品推荐
相关产品推荐

