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

C语言自定义行反转函数结果不稳定,求技术分析解决

问题分析与修复方案

核心问题点

  • 字符串未终止:main函数读取行字符后,没有给line数组添加字符串终止符'\0'。reverse函数依赖theline[i] != 0判断字符串结束,而未初始化的数组剩余位置是随机垃圾值,导致循环读取越界,这是运行结果不稳定的根本原因。
  • 反转循环逻辑错误:
    • 第一个循环结束后,i的值是原字符串的长度(比如原字符串有n个字符,i就等于n),此时tmp[i]未被赋值,是随机垃圾值。
    • 第二个循环从i >= 0开始,会先把这个垃圾值赋值给反转后字符串的开头,之后才开始复制有效字符,且循环结束后没有给反转后的字符串添加'\0',导致printf输出时读取到内存中的随机0,出现大量空格或垃圾数据。

修复后的代码

#include <stdio.h>

void reverse(char theline[150]){
    int i, j;
    char tmp[150];
    // 复制原字符串到tmp,包括终止符
    for (i = 0; theline[i] != '\0'; i++){
        tmp[i] = theline[i];
    }
    tmp[i] = '\0'; // 确保tmp也正确终止(可选,但更安全)
    
    // 从原字符串的最后一个有效字符开始反转
    j = 0;
    for (i--; i >= 0; i--, j++){
        theline[j] = tmp[i];
    }
    theline[j] = '\0'; // 给反转后的字符串添加终止符
}

int main() {
    char line[150];
    char c;
    int counter = 0;
    do {
        counter = 0;
        // 读取一行,同时防止数组越界(最多读149个字符,留位置给终止符)
        while (((c = getchar()) != '\n') && (c != EOF) && (counter < 149)) {
            line[counter] = c;
            counter++;
        }
        line[counter] = '\0'; // 关键:添加字符串终止符
        if (counter > 80){
            reverse(line);
            printf("%s\n", line);
        }
        // 如果一行超过149字符,跳过剩余部分直到换行或EOF
        while (c != '\n' && c != EOF) {
            c = getchar();
        }
    } 
    while (c != EOF);

    return 0;
}

关键修复说明

  1. main函数添加终止符:读取完一行后,必须执行line[counter] = '\0';,确保reverse函数能正确识别字符串边界。同时添加了数组越界判断,防止输入过长导致缓冲区溢出。
  2. reverse函数调整循环起点:第一个循环结束后,i是原字符串长度,执行i--让它指向最后一个有效字符,再开始复制,避免把垃圾值放到反转后的开头。
  3. 反转后添加终止符:循环结束后给theline[j]赋值'\0',确保printf输出时能正确停止,不会读取垃圾数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:51:31