求助!大一字符数组排序!

weixin_42472865 2018-06-16 08:56:48
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 20
int main()
{
FILE *fp1,*fp2,*fp3;
char s1[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);
strcat(s1,s2);
fclose(fp1);
fclose(fp2);
for(i=0;i<N;i++)
{
if(s1[i]>='A'&&s1[i]<='Z') s1[i]+=32;
}
puts(s1);
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;
}
}
}
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;
}


为何最后S1是空的??
...全文
2496 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_42472865 2018-07-05
  • 打赏
  • 举报
回复
引用 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;
}

谢谢!我写错了这么多也帮我改正过来了,我运行了一下没有问题了,谢谢!
自信男孩 2018-06-19
  • 打赏
  • 举报
回复
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
二班的码农 2018-06-17
  • 打赏
  • 举报
回复
另外 fgets(); 第二参数表示读取的最大字符数(包括\0),也就是说实际读取到的字符数要小于等于你设定的值
二班的码农 2018-06-17
  • 打赏
  • 举报
回复
楼主你想问什么,你那几个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; }

69,369

社区成员

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

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