PIPIOJ 1510 换座位问题

​问题链接PIPIOJ
思路:多组输入字符串(数组),交换指定两行字符串的方法通过swap和strcpy实现(c语言没有alth库需要定义函数swap)。注意:数组大小不能太小否则会数组越界,段错误。
代码如下:

#include <stdio.h>
#include <string.h>

void swap(char *a1,char*a2){
    char c[100];
    strcpy(c,a1);
    strcpy(a1,a2);
    strcpy(a2,c);
}
int main(){
    int n,m;
    scanf("%d %d\n",&n,&m);
    char arr[100000][100]={0};
    for(int i=0;i<n;i++){
        gets(arr[i]);
    }
    for(int i=1;i<=m;i++){
        int n1,n2;
        scanf("%d %d",&n1,&n2);
        swap(arr[n1-1],arr[n2-1]);
    }
    for(int i=0;i<n;i++){
        printf("%s\n",arr[i]);
    }
    return 0;
}

你题目是什么
char arr[100000][100]={0};
arr数组太大了
函数内局部变量的数组长度不能太大
改成全部变量的数组即可.
或者用 malloc()动态分配内存空间
局部变量是在程序运行栈上自动分配的,一般运行栈的大小是比较小的,大约即1~2MB,如果你定义一个很大的局部变量,很可能导致栈溢出。
而全局变量是在数据段中在程序加载时自动分配,大小可以定义的很大,只要你的电脑内存足够大。

你题目的解答代码如下:

#include <stdio.h>
#include <string.h>

void swap(char *a1,char*a2){
    char c[100];
    strcpy(c,a1);
    strcpy(a1,a2);
    strcpy(a2,c);
}
char arr[100000][100]={0};//改成全局变量
int main(){
    int n,m;
    scanf("%d %d\n",&n,&m);
    for(int i=0;i<n;i++){
        gets(arr[i]);
    }
    for(int i=1;i<=m;i++){
        int n1,n2;
        scanf("%d %d",&n1,&n2);
        swap(arr[n1-1],arr[n2-1]);
    }
    for(int i=0;i<n;i++){
        printf("%s\n",arr[i]);
    }
    return 0;
}

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img