You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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里的callocfree)。

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

火山引擎 最新活动