指针数组对字符串进行排序,问题出现在哪里

小飞好可爱 2015-09-28 12:43:37

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

int main(){
void change(char string[10]);
void rank(char *string[3]);

int i;
char *pointer[3];
char word[3][10];

for(i=0; i<3; i++) pointer[i]=word[i];
printf("input 3 strings:\n");
for(i=0; i<3; i++){
if(!i) printf("input the 1st number(end it with.):\n");
else if(1==i) printf("inout the 2rd number:\n");
else if(2==i) printf("input the 3th number:\n");
scanf("%s", word[i]);
change(word[i]);
}
rank(pointer);
printf("after rank:\n");
for(i=0; i<3; i++) printf("%s", *pointer[i]);
putchar('\n');

return 0;
}

void change(char string[10]){
int i=0;
while('.'!=string[i++]);
string[i]='\0';
}

void rank(char *string[3]){
int i, j, *temp;
for(i=0; i<3; i++){
for(j=0; j<2-i; j++){
if(strcmp(string[j], string[j+1])>0){
temp=string[j];
string[j]=string[j+1];
string[j+1]=temp;
}
}
}
}


程序在rank()那一行跑不起来,不知道这个函数哪里出了问题,大神求救啊!已哭晕在宿舍!
...全文
199 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
仅供参考

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


void change(char string[10]);
void rank(char *string[3]);

int main(){

	int i;
	char *pointer[3] = {0};
	char word[3][10] = {0};

	for(i=0; i<3; i++) pointer[i]=word[i];
	printf("input 3 strings:\n");
	for(i=0; i<3; i++)
	{
#if 0		
		if(!i) printf("input the 1st number(end it with.):\n");
		else if(1==i) printf("inout the 2rd number:\n");
		else if(2==i) printf("input the 3th number:\n");
#else
		printf("input the %d number(end it with.):\n", i + 1);
#endif		
input:		
		scanf("%s", word[i]); //因为word[i]的长度只有10,所以输入不能超过10个字符
		if(strlen(word[i]) >= 10)
		{
			printf("length must < 10, please rescaf\n");
			goto input;
		}
		
		change(word[i]);//这个有点多余
	}
	rank(pointer);
	printf("after rank:\n");
	for(i=0; i<3; i++) printf("%s\n", pointer[i]);
	putchar('\n');

	return 0;
}

void change(char string[10]){
	int i=0;
	while('.'!=string[i++]);
	string[i]='\0';
}

void rank(char *string[3]){
	int i, j;
	char temp[10] = {0};
	for(j=0; j<2; j++){
		if(strcmp(string[j], string[j+1])>0){
			//temp=string[j];
			strcpy(temp, string[j]);
			//string[j]=string[j+1];
			strcpy(string[j], string[j+1]);
			//string[j+1]=temp;
			strcpy(string[j+1], temp);
		}
	}
}
fly_dragon_fly 2015-09-28
  • 打赏
  • 举报
回复
编译器有什么提示了
小飞好可爱 2015-09-28
  • 打赏
  • 举报
回复
引用 7 楼 lm_whales 的回复:
rank() 没问题,rank后面的代码出错另外
。。。。。。。。。。。。。。。
rank(pointer); //没错的
printf("after rank:\n");
for(i=0; i<3; i++) printf("%s", *pointer[i]); 把这个 *去掉
putchar('\n');
修改后
。。。。。。。。。。。。。。。
rank(pointer);
printf("after rank:\n");
for(i=0; i<3; i++) printf("%s", pointer[i]); 
putchar('\n');
啊确实是的!改了之后跑的溜溜的!多谢大神指点,一语中的啊!
小飞好可爱 2015-09-28
  • 打赏
  • 举报
回复
引用 10 楼 grtorange 的回复:
你试一试++i;如果++i可以的话,应该就是你的编译器的问题了。我之前好像看到过说是有的编译器采用的标准不一样,所以对于自增的生效时刻的规定也不一样。
恢复错帖子了,自行忽视==。求删除。
小飞好可爱 2015-09-28
  • 打赏
  • 举报
回复
你试一试++i;如果++i可以的话,应该就是你的编译器的问题了。我之前好像看到过说是有的编译器采用的标准不一样,所以对于自增的生效时刻的规定也不一样。
lkjasdf9909 2015-09-28
  • 打赏
  • 举报
回复

for(i=0; i<3; i++) printf("%s\n", pointer[i]);
//*去掉,%s需要需要一个字符串首地址
lkjasdf9909 2015-09-28
  • 打赏
  • 举报
回复


//change也有问题,如果没有最后字符不是'.'会出现内存错误,所以需要加上string[i]!='\0'
void change(char string[10]){
	int i=0;
	while(string[i]!='.' && string[i]!='\0'){i++;}
		string[++i]='\0';
		printf("%s",string);
}




// char *temp=NULL;  把指针和指针交换
void rank(char *string[3]){
	int i, j;
	char *temp=NULL;
	for(i=0; i<3; i++){
		for(j=0; j<2-i; j++){
			if(strcmp(string[j], string[j+1])>0){
				temp=string[j];
				string[j]=string[j+1];
				string[j+1]=temp;
			}
		}
	}
}





lm_whales 2015-09-28
  • 打赏
  • 举报
回复
rank() 没问题,rank后面的代码出错另外
。。。。。。。。。。。。。。。
rank(pointer); //没错的
printf("after rank:\n");
for(i=0; i<3; i++) printf("%s", *pointer[i]); 把这个 *去掉
putchar('\n');
修改后
。。。。。。。。。。。。。。。
rank(pointer);
printf("after rank:\n");
for(i=0; i<3; i++) printf("%s", pointer[i]); 
putchar('\n');
diligent_snail 2015-09-28
  • 打赏
  • 举报
回复
temp是int*型指针,string[]是char*型指针,两者类型不同,不能用直接temp=string[j]
  • 打赏
  • 举报
回复
引用 4 楼 grtorange 的回复:
[quote=引用 2 楼 q3733353520 的回复:] 仅供参考

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


void change(char string[10]);
void rank(char *string[3]);

int main(){

	int i;
	char *pointer[3] = {0};
	char word[3][10] = {0};

	for(i=0; i<3; i++) pointer[i]=word[i];
	printf("input 3 strings:\n");
	for(i=0; i<3; i++)
	{
#if 0		
		if(!i) printf("input the 1st number(end it with.):\n");
		else if(1==i) printf("inout the 2rd number:\n");
		else if(2==i) printf("input the 3th number:\n");
#else
		printf("input the %d number(end it with.):\n", i + 1);
#endif		
input:		
		scanf("%s", word[i]); //因为word[i]的长度只有10,所以输入不能超过10个字符
		if(strlen(word[i]) >= 10)
		{
			printf("length must < 10, please rescaf\n");
			goto input;
		}
		
		change(word[i]);//这个有点多余
	}
	rank(pointer);
	printf("after rank:\n");
	for(i=0; i<3; i++) printf("%s\n", pointer[i]);
	putchar('\n');

	return 0;
}

void change(char string[10]){
	int i=0;
	while('.'!=string[i++]);
	string[i]='\0';
}

void rank(char *string[3]){
	int i, j;
	char temp[10] = {0};
	for(j=0; j<2; j++){
		if(strcmp(string[j], string[j+1])>0){
			//temp=string[j];
			strcpy(temp, string[j]);
			//string[j]=string[j+1];
			strcpy(string[j], string[j+1]);
			//string[j+1]=temp;
			strcpy(string[j+1], temp);
		}
	}
}
多谢大神,确实跑起来了,不过我看到了strcpy,这个应该是把字符串里面存储的内容给交换了下,但是我的初衷是建立一个指针数组,里面有三个指针,根据指针指向的数组的大小对三个指针进行排序,最后再按照pointer[0],pointer[1], pointer[2]进行输出。[/quote] 那你就改成交换不久行了
小飞好可爱 2015-09-28
  • 打赏
  • 举报
回复
引用 2 楼 q3733353520 的回复:
仅供参考

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


void change(char string[10]);
void rank(char *string[3]);

int main(){

	int i;
	char *pointer[3] = {0};
	char word[3][10] = {0};

	for(i=0; i<3; i++) pointer[i]=word[i];
	printf("input 3 strings:\n");
	for(i=0; i<3; i++)
	{
#if 0		
		if(!i) printf("input the 1st number(end it with.):\n");
		else if(1==i) printf("inout the 2rd number:\n");
		else if(2==i) printf("input the 3th number:\n");
#else
		printf("input the %d number(end it with.):\n", i + 1);
#endif		
input:		
		scanf("%s", word[i]); //因为word[i]的长度只有10,所以输入不能超过10个字符
		if(strlen(word[i]) >= 10)
		{
			printf("length must < 10, please rescaf\n");
			goto input;
		}
		
		change(word[i]);//这个有点多余
	}
	rank(pointer);
	printf("after rank:\n");
	for(i=0; i<3; i++) printf("%s\n", pointer[i]);
	putchar('\n');

	return 0;
}

void change(char string[10]){
	int i=0;
	while('.'!=string[i++]);
	string[i]='\0';
}

void rank(char *string[3]){
	int i, j;
	char temp[10] = {0};
	for(j=0; j<2; j++){
		if(strcmp(string[j], string[j+1])>0){
			//temp=string[j];
			strcpy(temp, string[j]);
			//string[j]=string[j+1];
			strcpy(string[j], string[j+1]);
			//string[j+1]=temp;
			strcpy(string[j+1], temp);
		}
	}
}
多谢大神,确实跑起来了,不过我看到了strcpy,这个应该是把字符串里面存储的内容给交换了下,但是我的初衷是建立一个指针数组,里面有三个指针,根据指针指向的数组的大小对三个指针进行排序,最后再按照pointer[0],pointer[1], pointer[2]进行输出。
小飞好可爱 2015-09-28
  • 打赏
  • 举报
回复
引用 1 楼 fly_dragon_fly 的回复:
编译器有什么提示了
编译没有问题,没报错也没有警告,但就是运行的时候不行。

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧