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

C语言字符串输入函数异常:输入3字符后程序终止问题求助

问题修复:动态字符串输入函数异常终止与截断问题

问题描述

编写的inputStringaAndCreateReverse函数预期实现:读取用户输入并动态扩展字符串数组stringa,直到用户按下回车键;随后将reverse数组扩展至与stringa相同大小。但实际运行时,输入3个字符后程序停止,测试输入“hello”最终仅得到“hell”。

函数代码:

void inputStringaAndCreateReverse(char* *stringa, char* *reverse, int* iStringa) {
    int inputChar, i = 0, size = 1;
    bool notEnter = true;
    printf("Insert the string: ");
    while (notEnter) {
        if ((inputChar = getche()) != '\r') {
            *stringa[i] = inputChar;
            i++;
            *stringa = realloc(*stringa, (++size) * sizeof(char));
        } else if (size != 1) {
            notEnter = false;
            system("CLS");
        } else {
            printf("\n");
        }
    }
    *stringa[i] = '\0';
    *iStringa = strlen(*stringa) - 1;
    *reverse = realloc(*reverse, (*iStringa + 1) * sizeof(char));
}

stringa与reverse在main函数中的初始分配:

stringa = (char*) malloc(sizeof(char));

问题根源

  1. 数组访问优先级错误:*stringa[i]的写法存在优先级问题,[]优先级高于*,实际执行的是*(stringa[i]),而非预期的(*stringa)[i]。这会导致访问非法内存,触发程序崩溃或异常终止。
  2. 终止符写入位置错误:循环结束后*stringa[i] = '\0'同样存在优先级问题,无法正确写入字符串结束符,导致字符串截断。
  3. 内存分配无错误检查:realloc可能返回NULL,直接赋值会丢失原内存地址,同时未处理分配失败的情况,加剧程序异常风险。

修复后的代码

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

void inputStringaAndCreateReverse(char** stringa, char** reverse, int* iStringa) {
    int inputChar, i = 0;
    size_t size = 1;
    bool notEnter = true;

    printf("Insert the string: ");
    while (notEnter) {
        inputChar = getche();
        if (inputChar != '\r') {
            // 正确访问字符串数组元素
            (*stringa)[i] = inputChar;
            i++;
            // 扩容并检查分配结果
            size++;
            char* temp = realloc(*stringa, size * sizeof(char));
            if (temp == NULL) {
                perror("realloc failed");
                free(*stringa);
                exit(EXIT_FAILURE);
            }
            *stringa = temp;
        } else {
            if (size == 1) {
                // 处理空输入,设置空字符串
                (*stringa)[0] = '\0';
                printf("\n");
            }
            notEnter = false;
            system("CLS");
        }
    }
    // 正确写入字符串终止符
    (*stringa)[i] = '\0';
    // 获取最后一个字符的索引
    *iStringa = strlen(*stringa) - 1;
    // 扩展reverse数组并检查分配结果
    char* rev_temp = realloc(*reverse, (*iStringa + 1) * sizeof(char));
    if (rev_temp == NULL) {
        perror("realloc for reverse failed");
        free(*stringa);
        free(*reverse);
        exit(EXIT_FAILURE);
    }
    *reverse = rev_temp;
}

关键修改说明

  • 修正数组访问方式:将所有*stringa[i]替换为(*stringa)[i],先解引用二级指针得到字符串指针,再通过下标访问元素,确保内存访问合法。
  • 添加内存分配错误检查:用临时变量接收realloc返回值,分配失败时打印错误信息并清理内存,避免内存泄漏和空指针访问。
  • 规范空输入处理:用户直接按回车时主动设置空字符串,避免后续strlen调用出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 03:37:31