这个题目个人认为比较重要,涉及了多方面的知识(包括字符指针数组,动态内存分配,排序法,字符数组的各种注意事项)
先看题目吧
下面是AC代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 100005
char *str[50005],*t; //定义字符指针数组
char s[max];
char a[max];
int main()
{
int n;
scanf("%d",&n);
getchar();
for (int i=0; i<n; i++)
{
gets(s);
int len=strlen(s);
str[i]=(char *)malloc(sizeof(char)*(len+1)); //此处动态内存分配要注意分配len+1,具体原因在下面说
strcpy(str[i],s);
}
for (int i=0; i<n-1; i++) //冒泡排序,我个人比较习惯这样写,可能和在别的地方看见的不一样
{
for (int j=i+1; j<n; j++)
{
if (strcmp(str[i],str[j])>0)
{
t=str[i];
str[i]=str[j];
str[j]=t;
}
}
}
for (int i=0; i<n; i++) //按照要求输出
{
if(i!=0)
printf("\n");
printf("%s",str[i]);
}
}
这题尝试了许多次,主要的问题差不多都出现在动态内存分配的地方:
这是第一次写的,第一次看见题目中说字符串不超过100000,然后我想都没想直接在后面乘100000,然后一提交,内存爆了(而且malloc前面漏了类型转换);
str[i]=malloc(sizeof(char)*100000);
这是后来重新写的重新定义一个字符数组,向该字符数组输入然后根据这个字符数组的长度来分配内存,但是还是存在问题,提交之后Runtime Error了;
gets(s);
int len=strlen(s);
str[i]=(char *)malloc(sizeof(char)*(len));
strcpy(str[i],s);
后来又尝试了许多遍后终于发现了问题所在:内存分配小了!!因为这是字符数组,在末尾有串结束标志'\0'!!!如果内存分配的大小为len+1的话串结束标志无法读到,在后面的操作中导致指针访问了非法内存,从而Runtime Error;改正之后终于AC了。
str[i]=(char *)malloc(sizeof(char)*(len+1));
关于这道题在第一次做的时候没对指针字符数组分配内存,然后运行时输入完数字后程序自动结束了,无法继续下面的操作,所以以后在使用指针字符数组时一定要记得给它分配内存空间!!!