user-0 提问: 求助！大一字符数组排序！

回复:
user: user-0
content: 引用 1 楼 ant2012 的回复:楼主你想问什么，你那几个txt文件的数据是什么，不过你的代码有些问题，如s1和s2的大小都是N，而且都从各自的文本里读取最多N个字符，但假如真实读取的字符strlen(s1)+strlen(s2) >= N就会导致strcat时s1越界，一但发生这种情况，得到的结果是不可预料的，而且，你在冒泡排序时（即你那两个for循环）for(j=0;j<2*N-1-i;j++)，j可能取到 2*N - 1的值，已经超过你给s1分配的N。 修改方案参考如下： #include <stdio.h> #include <conio.h> #include <stdlib.h> #include<string.h>  #define N 20  int main(int argc, char* argv[]) { 	FILE *fp1, *fp2, *fp3; 	char s1[2 * N], s2[N], temp; 	int i, j; 	if ((fp1 = fopen("D:\\6.13\\A.txt", "r")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	if ((fp2 = fopen("D:\\6.13\\B.txt", "r")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	fgets(s1, N, fp1); 	fgets(s2, N, fp2); 	fclose(fp1); 	fclose(fp2);  	strcat(s1, s2); 	int totalCount = strlen(s1);	// s1和s2实际读取字符的总个数 	for (i = 0; i < totalCount; i++) 	{ 		if (s1[i] >= 'A' && s1[i] <= 'Z') s1[i] += 32; 	} 	puts(s1);  	for (i = 0; i < totalCount - 1; i++) 	{ 		for (j = 0; j < totalCount - 1 - i; j++) 		{ 			if (s1[j] > s1[j + 1]) 			{ 				temp = s1[j]; 				s1[j] = s1[j + 1]; 				s1[j + 1] = temp; 			} 		} 	}  	puts(s1); 	if ((fp3 = fopen("D:\\6.13\\C.txt", "w")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	fputs(s1, fp3); 	fputs("\n", fp3); 	return 0; }  引用 1 楼 ant2012 的回复:楼主你想问什么，你那几个txt文件的数据是什么，不过你的代码有些问题，如s1和s2的大小都是N，而且都从各自的文本里读取最多N个字符，但假如真实读取的字符strlen(s1)+strlen(s2) >= N就会导致strcat时s1越界，一但发生这种情况，得到的结果是不可预料的，而且，你在冒泡排序时（即你那两个for循环）for(j=0;j<2*N-1-i;j++)，j可能取到 2*N - 1的值，已经超过你给s1分配的N。 修改方案参考如下： #include <stdio.h> #include <conio.h> #include <stdlib.h> #include<string.h>  #define N 20  int main(int argc, char* argv[]) { 	FILE *fp1, *fp2, *fp3; 	char s1[2 * N], s2[N], temp; 	int i, j; 	if ((fp1 = fopen("D:\\6.13\\A.txt", "r")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	if ((fp2 = fopen("D:\\6.13\\B.txt", "r")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	fgets(s1, N, fp1); 	fgets(s2, N, fp2); 	fclose(fp1); 	fclose(fp2);  	strcat(s1, s2); 	int totalCount = strlen(s1);	// s1和s2实际读取字符的总个数 	for (i = 0; i < totalCount; i++) 	{ 		if (s1[i] >= 'A' && s1[i] <= 'Z') s1[i] += 32; 	} 	puts(s1);  	for (i = 0; i < totalCount - 1; i++) 	{ 		for (j = 0; j < totalCount - 1 - i; j++) 		{ 			if (s1[j] > s1[j + 1]) 			{ 				temp = s1[j]; 				s1[j] = s1[j + 1]; 				s1[j + 1] = temp; 			} 		} 	}  	puts(s1); 	if ((fp3 = fopen("D:\\6.13\\C.txt", "w")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	fputs(s1, fp3); 	fputs("\n", fp3); 	return 0; }  引用 1 楼 ant2012 的回复:楼主你想问什么，你那几个txt文件的数据是什么，不过你的代码有些问题，如s1和s2的大小都是N，而且都从各自的文本里读取最多N个字符，但假如真实读取的字符strlen(s1)+strlen(s2) >= N就会导致strcat时s1越界，一但发生这种情况，得到的结果是不可预料的，而且，你在冒泡排序时（即你那两个for循环）for(j=0;j<2*N-1-i;j++)，j可能取到 2*N - 1的值，已经超过你给s1分配的N。 修改方案参考如下： #include <stdio.h> #include <conio.h> #include <stdlib.h> #include<string.h>  #define N 20  int main(int argc, char* argv[]) { 	FILE *fp1, *fp2, *fp3; 	char s1[2 * N], s2[N], temp; 	int i, j; 	if ((fp1 = fopen("D:\\6.13\\A.txt", "r")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	if ((fp2 = fopen("D:\\6.13\\B.txt", "r")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	fgets(s1, N, fp1); 	fgets(s2, N, fp2); 	fclose(fp1); 	fclose(fp2);  	strcat(s1, s2); 	int totalCount = strlen(s1);	// s1和s2实际读取字符的总个数 	for (i = 0; i < totalCount; i++) 	{ 		if (s1[i] >= 'A' && s1[i] <= 'Z') s1[i] += 32; 	} 	puts(s1);  	for (i = 0; i < totalCount - 1; i++) 	{ 		for (j = 0; j < totalCount - 1 - i; j++) 		{ 			if (s1[j] > s1[j + 1]) 			{ 				temp = s1[j]; 				s1[j] = s1[j + 1]; 				s1[j + 1] = temp; 			} 		} 	}  	puts(s1); 	if ((fp3 = fopen("D:\\6.13\\C.txt", "w")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	fputs(s1, fp3); 	fputs("\n", fp3); 	return 0; } 谢谢！我写错了这么多也帮我改正过来了，我运行了一下没有问题了，谢谢！

user: user-1
content: for(i=0;i<2*N-1;i++)     {         for(j=0;j<2*N-1-i;j++)         {             if(s1[j]>s1[j+1])             {                 temp=s1[j];                 s1[j]=s1[j+1];                 s1[j+1]=temp;             }         }     } 这个地方已经越界访问了，因为s1的长度是N，而循环的次数是2N - 1

user: user-2
content: 另外 fgets(); 第二参数表示读取的最大字符数（包括\0），也就是说实际读取到的字符数要小于等于你设定的值

user: user-2
content: 楼主你想问什么，你那几个txt文件的数据是什么，不过你的代码有些问题，如s1和s2的大小都是N，而且都从各自的文本里读取最多N个字符，但假如真实读取的字符strlen(s1)+strlen(s2) >= N就会导致strcat时s1越界，一但发生这种情况，得到的结果是不可预料的，而且，你在冒泡排序时（即你那两个for循环）for(j=0;j<2*N-1-i;j++)，j可能取到 2*N - 1的值，已经超过你给s1分配的N。 修改方案参考如下： #include <stdio.h> #include <conio.h> #include <stdlib.h> #include<string.h>  #define N 20  int main(int argc, char* argv[]) { 	FILE *fp1, *fp2, *fp3; 	char s1[2 * N], s2[N], temp; 	int i, j; 	if ((fp1 = fopen("D:\\6.13\\A.txt", "r")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	if ((fp2 = fopen("D:\\6.13\\B.txt", "r")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	fgets(s1, N, fp1); 	fgets(s2, N, fp2); 	fclose(fp1); 	fclose(fp2);  	strcat(s1, s2); 	int totalCount = strlen(s1);	// s1和s2实际读取字符的总个数 	for (i = 0; i < totalCount; i++) 	{ 		if (s1[i] >= 'A' && s1[i] <= 'Z') s1[i] += 32; 	} 	puts(s1);  	for (i = 0; i < totalCount - 1; i++) 	{ 		for (j = 0; j < totalCount - 1 - i; j++) 		{ 			if (s1[j] > s1[j + 1]) 			{ 				temp = s1[j]; 				s1[j] = s1[j + 1]; 				s1[j + 1] = temp; 			} 		} 	}  	puts(s1); 	if ((fp3 = fopen("D:\\6.13\\C.txt", "w")) == NULL) 	{ 		printf("cannot open file\n"); 		exit(0); 	} 	fputs(s1, fp3); 	fputs("\n", fp3); 	return 0; }