为什么将2-2排序,读写到test2-3.txt文件,2-3和想象中的结果不一样

#include<stdio.h>
#define N 100
int main()
{
FILE rfp=fopen("test2-2.txt","r");
int i,j,lens,t;
char a=(char)malloc(10
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=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;
}

img

img

(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;
}

img



```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;
}

img

既然作了预处理定义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;
}