user-0 提问: 指针数组对字符串进行排序，问题出现在哪里

回复:
user: user-1
content: 仅供参考  # 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); 		} 	} }

user: user-2
content: 编译器有什么提示了

user: user-0
content: 引用 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'); 啊确实是的！改了之后跑的溜溜的！多谢大神指点，一语中的啊！

user: user-0
content: 引用 10 楼 grtorange 的回复:你试一试++i；如果++i可以的话，应该就是你的编译器的问题了。我之前好像看到过说是有的编译器采用的标准不一样，所以对于自增的生效时刻的规定也不一样。 恢复错帖子了，自行忽视==。求删除。

user: user-0
content: 你试一试++i；如果++i可以的话，应该就是你的编译器的问题了。我之前好像看到过说是有的编译器采用的标准不一样，所以对于自增的生效时刻的规定也不一样。

user: user-3
content: for(i=0; i<3; i++) printf("%s\n", pointer[i]); //*去掉，%s需要需要一个字符串首地址

user: user-3
content: //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; 			} 		} 	} }

user: user-4
content: 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');

user: user-5
content: temp是int*型指针，string[]是char*型指针，两者类型不同，不能用直接temp=string[j]

user: user-1
content: 引用 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]  那你就改成交换不久行了

user: user-0
content: 引用 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]进行输出。

user: user-0
content: 引用 1 楼 fly_dragon_fly 的回复:编译器有什么提示了 编译没有问题，没报错也没有警告，但就是运行的时候不行。