C语言字符串数组反转去数字功能程序崩溃问题求助
问题分析与解决方案
我看了你的代码,发现几个关键问题直接导致了程序崩溃,还有逻辑不符合题目要求的地方,咱们一步步来理清楚:
一、直接触发崩溃的核心问题
- 数组定义错误:你写的
char *array[n][20];是一个二维指针数组,每个元素都是char*类型,但你实际需要的是存储n个字符串(每个字符串是字符数组)。正确的定义应该是char array[n][20];——这是一个二维字符数组,每个子数组可以容纳最多19个字符加一个结束符'\0'。 - scanf访问越界:
scanf("%s",array[i][20]);里的array[i][20]是第i行的第21个元素(数组下标从0开始,20已经超出了每个子数组的长度范围),你在往非法内存地址写入数据,这直接触发了程序崩溃。正确的写法是scanf("%s", array[i]);,因为array[i]指向第i个字符串的首地址。
二、函数参数不匹配问题
你的invert函数期望接收char**类型的参数,但如果你用二维字符数组char array[n][20],传递给函数时会退化为char (*array)[20](指向长度为20的字符数组的指针),两者类型不匹配,会导致指针操作错误。我们需要调整invert的参数类型:
void invert(char (*array)[20], int n) { if(n>0) { processing_string(array[n-1]); invert(array, n-1); } }
三、字符串处理逻辑错误
题目要求反转后的字符串不能包含数字,但你的代码现在是只保留数字、丢弃非数字字符,这完全反了。需要修改processing_string里的判断条件,改为保留非数字字符:
// 原来的错误判断:保留数字 // if(s[i]>='0' && s[i]<='9') { // 修改为:保留非数字 if(!(s[i]>='0' && s[i]<='9')) { t[j++]=s[i]; }
四、修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> void processing_string(char *s); void invert(char (*array)[20], int n) { if(n>0) { processing_string(array[n-1]); invert(array, n-1); } } void processing_string(char *s) { int d = strlen(s); // 反转字符串 for(int i=0; i<d/2; i++) { char c = s[i]; s[i] = s[d-i-1]; s[d-i-1] = c; } // 过滤数字,保留非数字字符 char *t = (char*)calloc(d+1, sizeof(char)); for(int i=0, j=0; i<d; i++) { if(!(s[i]>='0' && s[i]<='9')) { t[j++] = s[i]; } } strcpy(s, t); free(t); } int main() { int n; printf("n="); scanf("%d", &n); // 修正数组定义 char array[n][20]; // 修正scanf的目标地址 for(int i=0; i<n; i++) { scanf("%s", array[i]); } invert(array, n); for(int i=0; i<n; i++) { printf("%s\n", array[i]); } return 0; }
额外说明
- 递归的
invert函数是可行的,但如果n很大的话可能会有栈溢出风险,用循环实现会更稳妥,比如:
void invert(char (*array)[20], int n) { for(int i=0; i<n; i++) { processing_string(array[i]); } }
- 如果你想使用指针数组(
char *array[n])的方式,需要为每个字符串分配内存,比如用malloc,但对于初学者来说,二维字符数组的方式更简单且无需额外的内存管理(除了processing_string里的calloc和free)。
内容的提问来源于stack exchange,提问作者Logicnot Found




