C语言问题求解!!!!
在主函数中输入10个等长的字符串。用另外一函数对他们进行排序(采用字符的升序或降序)。然后在主函数输出这10个已经排好序的字符串(不允许采用函数)
帮我看下是哪里错了,该怎么改,谢谢了;
/*************
顺序为:升序;
*************/
#include"stdio.h"
#include "string.h"
void main()
{
int mystrcmp(char *str1, char *str2);
char a[10][80],*c;
int i,j;
for(i=0;i<10;i++)
{
gets(a[i]);
}
for(j=0;j<9;j++)
{
for(i=0;i<9-j;i++)
{
if(mystrcmp(a[i+1],a[i])<0)
{
strcpy(c,a[i]);
strcpy(a[i],a[i+1]);
strcpy(a[i+1],c);
}
}
printf("\n");
}
}
int mystrcmp(char *str1, char *str2)
{
char *p, *q;
p = str1;
q = str2;
while((*p == *q) && *p && *q) {
p++; q++;
}
return (*p - *q);
}
答案:编译时,编译器的警告说指针c未初始化,测试了一下,段错误,能引起段错误的也就是那个指针c了。
指针只是用于保存地址,你的这几段代码:
strcpy(c,a[i]);
strcpy(a[i],a[i+1]);
strcpy(a[i+1],c);
是在交换a[i]字符串和a[i+1]字符串的内容吗?
明显会出错,指针c没有初始值,它保存的地址是随机的,你用strcpy(c,a[i]);,把a[j]中的数据拷贝到随机地址的内存空间里,这不是乱放吗?指针c所指向的内存空间不属于你的程序,你的程序没权限往这内存空间写东西,所以,报错,程序终止。
除非,你申请一段内存空间,用指针c保存这个内存空间的地址,那就可以。
不明白你是如何想的,你的要求是:
1,在主函数中输入10个等长的字符串。
2,用另外一函数对他们进行排序(采用字符的升序或降序)。还有个要求:不允许采用函数,这是什么意思?是不允许采样系统自带的函数,还是不允许采样自定义函数,还是不允许采用任何函数?
第一个要求是满足了,可第二个呢?唯一一个“另外一函数” 是mystrcmp()函数,可它的功能不是“对他们进行排序”。
按我的理解,第二个要求,是写个自定义函数,对字符串中的字符进行排序。而你这代码,貌似是对比两个字符串,不一样就交换位置,只是 “不一样”,没有谁大谁小,这这么排序。
至于main函数的位置,我个人认为main函数写最底下,其它函数写上面,这样,省得main函数要调用函数时,再声明一次函数。
代码已重写,下面是代码:
#include <stdio.h>
#include <string.h>
/* 功能:将字符串中的字符进行升序排序 */
void sort(char *str)
{
int i, j;
char temp;
//以下是最容易想到的算法,高级的算法懒得想了
for(i=0; str[i] != 0; i++)
{//遍历字符串
for(j=i+1; str[j] != 0; j++)
{
if(str[i] > str[j])
{//如果第 i 个字符的大于它后面的第 j 个字符,就交换位置
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
}
}
#define N 10
int main()
{
char a[10][80];
int i;
//输入N个字符串
for(i=0;i<N;i++)
scanf("%s",a[i]);
for(i=0;i<N;i++)
{//将N个字符串进行排序,并输出显示
sort(a[i]);
printf("%s\n", a[i]);
}
return 0;
}
上一个:C语言怎么学
下一个:c语言教程