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

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是空的??
...全文
2502 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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; }
资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 松下电工数字压力传感器用户手册详细介绍了DP-100系列数字压力传感器,涵盖其技术参数、操作方法及适用场景等,适用于各类需要精准压力测量的工业环境。 双屏显示:主屏与输出动作同步,可同时显示当前值和基准值,便于实时监控与调整。显示屏为12段字母数字显示,数字清晰易读。 三色指示:屏幕颜色随传感器状态变化(红、绿、橙),便于快速判断工作状态。 紧凑结构:尺寸仅□30mm,适合空间狭窄的安装环境。 多种操作模式:提供RUN模式(日常操作)、菜单设定模式(深入设置如输出模式切换)及PRO模式(高级功能如应差调整、复制设定)。 安全认证:DP-101(A)/102(A)型号通过特定认证,确保产品安全可靠。 复制功能:可通过数据通信将主传感器设定内容复制到其他传感器,减少人工设定错误,节省时间。 高性能传感:具备高精度,分辨率1/2,000,反应时间2.5ms(最长5,000ms可调),温度特性±0.5%F.S.,重复精度±0.1%F.S. 电子元件吸附检测:监测吸盘是否成功吸附电子元件。 总压力监测:测量管道或容器内的压力水平。 空气泄漏检测:通过压力变化检测泄漏情况。 DP-101□:适用于低压环境(-100kPa至100kPa)。 DP-102□:适用于高压环境(0kPa至1MPa)。 订购时需根据实际需求选择合适型号,考虑传感器的适用范围和工作条件。手册提供详细订购流程及注意事项,包括相关认证信息(如韩国S标志)。 复制功能:通过数据通信将主传感器设定复制到其他传感器,支持多种设定模式,避免设定错误,节省时间。 操作模式:RUN模式用于日常监控,菜单设定模式用于深入设置,PRO模式提供高级功能。 使用前需仔细阅读手册,了解各功能使用方法。遵循安全指南,正确安装和使用传感器,避免损坏。对于

70,023

社区成员

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

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