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));
问题根源
- 数组访问优先级错误:
*stringa[i]的写法存在优先级问题,[]优先级高于*,实际执行的是*(stringa[i]),而非预期的(*stringa)[i]。这会导致访问非法内存,触发程序崩溃或异常终止。 - 终止符写入位置错误:循环结束后
*stringa[i] = '\0'同样存在优先级问题,无法正确写入字符串结束符,导致字符串截断。 - 内存分配无错误检查:
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
相关产品推荐
相关产品推荐

