#include<stdio.h>
#define N 100
int main()
{
FILE rfp=fopen("test2-2.txt","r");
int i,j,lens,t;
char a=(char)malloc(10sizeof(char));
for(lens=0;!feof(rfp);lens++)
{
fread((a+lens),sizeof(char),1,rfp);
}
fclose(rfp);
(a+lens)='\0';
for(i=0;i<lens-1;i++)
{
for(j=0;j<lens-1-i;j++)
{
if(*(a+j)>(a+(j+1)))
{
t=*(a+j);
(a+j)=(a+(j+1));
(a+(j+1))=(a+j);
}
}
}
write(a,lens);
return 0;
}
int write(char *a,int lens)
{
FILE wfp=fopen("test2-3.txt","w");
int i;
for(i=0;i<lens-1;i++)
{
fputc((a+i),wfp);
}
fclose(wfp);
return 0;
}
(1)申请空间的时候,不应该申请10个,你txt文件长度大于10,申请10个空间会越界
(2)读取字符的时候,应该判断一下是否读取成功,把fread放在if语句中,读取成功再 len++
(3)排序的地方,数据交换的最后一行,应该是=t
代码修改如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#define N 100
int write(char* a, int lens);
int main()
{
FILE* rfp = fopen("test2-2.txt", "r");
int i, j, lens, t;
char* a = (char*)malloc(N*sizeof(char));
for (lens = 0; !feof(rfp); )
{
if (fread((a + lens), sizeof(char), 1, rfp))
lens++;
}
fclose(rfp);
*(a + lens) = '\0';
for (i = 0; i < lens - 1; i++)
{
for (j = 0; j < lens - 1 - i; j++)
{
if (*(a + j) > *(a + (j + 1)))
{
t = *(a + j);
*(a + j) = *(a + (j + 1));
*(a + (j + 1)) = t;
}
}
}
write(a, lens);
return 0;
}
int write(char* a, int lens)
{
FILE* wfp = fopen("test2-3.txt", "w");
int i;
for (i = 0; i < lens - 1; i++)
{
fputc(*(a + i), wfp);
}
fclose(wfp);
return 0;
}
问题1:
//申请空间改成如下
char* a = (char*)malloc(N*sizeof(char));
问题2:
错误应该是减去2,‘\0’不需要做比较
for (i = 0; i < lens - 2; i++)
{
for (j = 0; j < lens - 2 - i; j++)
{
if (*(a + j) > *(a + (j + 1)))
{
t = *(a + j);
*(a + j) = *(a + (j + 1));
*(a + (j + 1)) = t;//错误应该是t
}
}
}
参考代码如下
#include<stdio.h>
#include <stdlib.h>
#define N 100
int write(char *a, int lens);
int main()
{
FILE* rfp = fopen("test2-2.txt", "r");
int i, j, lens, t;
char* a = (char*)malloc(N*sizeof(char));
for (lens = 0; !feof(rfp); lens++)
{
fread((a + lens), sizeof(char), 1, rfp);
}
fclose(rfp);
*(a + lens) = '\0';
//错误应该是减去2,‘\0’不需要做比较
for (i = 0; i < lens - 2; i++)
{
for (j = 0; j < lens - 2 - i; j++)
{
if (*(a + j) > *(a + (j + 1)))
{
t = *(a + j);
*(a + j) = *(a + (j + 1));
*(a + (j + 1)) = t;//错误
}
}
}
write(a, lens);
return 0;
}
int write(char *a, int lens)
{
FILE* wfp = fopen("test2-3.txt", "w");
int i;
for (i = 0; i < lens - 1; i++)
{
fputc(*(a + i), wfp);
}
fclose(wfp);
return 0;
}
```c
#include<stdio.h>
#include<stdlib.h>
#define N 100
int write(char *a,int lens);
int main()
{
FILE *rfp = fopen("test2-2.txt","r");
int i,j,lens;
char t;
char*a=(char*)malloc(N*sizeof(char));
for(lens=0;!feof(rfp);lens++)
{
fread((a+lens),sizeof(char),1,rfp);
}
fclose(rfp);
*(a+lens)='\0';
for (i=0;i<lens-1;i++)
{
for (j=i+1;j<lens-1;j++)
{
if (*(a+i) > *(a+j))
{
t = *(a+i);
*(a+i) = *(a+j);
*(a+j) = t;
}
}
}
//for(i=0;i<lens-1;i++)
//{
// for(j=0;j<lens-1-i;j++)
// {
// if(*(a+j) > *(a+(j+1)))
// {
// t=*(a+j);
// *(a+j)=*(a+(j+1));
// *(a+(j+1))=t;
// }
// }
//}
write(a,lens);
free(a);
return 0;
}
int write(char *a,int lens)
{
FILE *wfp = fopen("test2-3.txt","w");
//fputs(a,wfp);
int i;
for(i=0;i<lens-1;i++)
{
fputc(*(a+i),wfp);
}
fclose(wfp);
return 0;
}
```
修改处见注释,供参考:
#include <stdio.h>
#include <stdlib.h>
#define N 100
int write(char* a, int lens);
int main()
{
FILE* rfp = fopen("test2-2.txt", "r");
int i, j, lens, t;
char* a = (char*)malloc(N * sizeof(char)); //修改 (char*)malloc(10 * sizeof(char))
for (lens = 0; fread((a + lens), sizeof(char), 1, rfp) == 1; lens++); //!feof(rfp) 修改
//{
//fread((a + lens), sizeof(char), 1, rfp); 修改
//}
fclose(rfp);
*(a + lens) = '\0';
for (i = 0; i < lens - 1; i++)
{
for (j = 0; j < lens - 1 - i; j++)
{
if (*(a + j) > *(a + (j + 1)))
{
t = *(a + j);
*(a + j) = *(a + (j + 1));
*(a + (j + 1)) = t;
//*(a + (j + 1)) = *(a + j); //修改
}
}
}
write(a, lens);
return 0;
}
int write(char* a, int lens)
{
FILE* wfp = fopen("test2-3.txt", "w");
int i;
for (i = 0; i < lens; i++) //for (i = 0; i < lens - 1; i++) 修改
{
fputc(*(a + i), wfp);
}
fclose(wfp);
return 0;
}
既然作了预处理定义N, 不如直接声明: char a[N];
#include<stdio.h>
#define N 100
int main()
{
int i=0,j,k;
char a[N],t;
//打开文件,读取存入数组 a[N]中
FILE *fp=fopen("d:\\test2-2.txt","r");
while((a[i++]=fgetc(fp)) != EOF);
a[i] = '\0';
fclose(fp);
// 以ascii大小升序排列数组元素
for (j=0;j<i-2;j++)
for (k=j+1;k<i-1;k++){
if (a[j]>a[k]){ //若要降序把条件改成 < 号
t = a[j]; a[j]=a[k]; a[k]=t;
}
}
//数组元素逐个写入文件 , 并显示到屏幕上
fp=fopen("d:\\test2-3.txt","w");
i = 0;
while(a[i]!='\0'){
fputc(a[i++],fp);
putchar(a[i-1]);
}
fclose(fp);
return 0;
}