2301_80630928 2023-12-25 11:22 采纳率: 16.7%
浏览 8
已结题

C语言向文件中随机插入字符串,结果出现乱码问题,怎么修改

C语言向文件中随机插入字符串,结果出现乱码问题,怎么修改


int insert()//插入函数 
{
    system("cls");
    char word[200];
    int n,pos;
    char ch[1024],ch1[1024];
    char chh[1024];
    int i=1,j,lenth,len;
    FILE*fp;
    int select,select1;
    printf("请选择您要插入的文本:\n");
    printf("********************\n");
    printf("******文本菜单******\n");
    printf("********************\n");
    printf("1.纯英文.\n");
    printf("2.纯中文.\n");
    printf("3.中文英文混合.\n");
    printf("0.返回.\n"); 
    printf("********************\n");
    printf("您选择:");
    scanf("%d",&select);
    if(select==1)
    {
        fp=fopen("《cat and pig》.txt","r+");
    }
    if(select==2)
    {
        fp=fopen("《猫和猪》.txt","r+");
    }
    if(select==3)
    {
        fp=fopen("《猫和pig》.txt","r+");
    }
    if(select==0)
    {
        return 0;
    }
    while(!feof(fp))//直到读取到文件尾 
    {
        fscanf(fp,"%c",&ch[i]);
        i++;
    }
    fclose(fp);
    printf("已成功读取文本!!!\n");
    printf("请输入你要插入的字符串:");
    fflush(stdin);
    gets(word);
    printf("请输入您要随机插入的次数:");
    scanf("%d",&n);
    lenth=i;//无\0,不能用strlen 
    strcpy(ch1,ch);
    len=strlen(word);
    srand(time(NULL)); //使数据更随机 
    for(j=0;j<n;j++)
    {
        pos=rand()%lenth+1;
        printf("随机位置:%d",pos);
        printf("\n"); 
        for(i=0;i<lenth+len+len*j;i++)
        {
            if(i<pos)//未到插入位置 
            {
                chh[i]=ch1[i];
            }
            else if(i<pos+len)
            {
                chh[i]=word[i-pos];//把word插入 
            }
            else//超出范围 
            {
                chh[i]=ch1[i-len];
            } 
        }
        
    }
    for(i=0;i<lenth+len*n;i++)
    {
        printf("%c",chh[i]);
    } 
    printf("您已完成了插入,是否存盘?\n");
    printf("********************\n");
    printf("1.YES.\n");
    printf("2.NO.\n");
    printf("你选择:");
    scanf("%d",&select1);
    if(select1==1)
    {
        save(select,lenth+len*n,chh);//存盘 
    } 
    else
    {
        printf("程序结束!!"); 
        return 0;
    }
        
} 
  • 写回答

2条回答 默认 最新

  • 柯本 2023-12-25 12:34
    关注

    乱码帮你解决了,但你的(多次)插入方法有问题,你自己再研究下

      #include <stdio.h> 
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    int insert()//插入函数 
    {
        system("cls");
        char word[200];
        int n,pos;
        char ch[1024],ch1[1024];
        char chh[1024];
        int i=0,j,k,lenth,len; //here:i要从0开始的,加个变量k
        FILE*fp;
        int select,select1;
        printf("请选择您要插入的文本:\n");
        printf("********************\n");
        printf("******文本菜单******\n");
        printf("********************\n");
        printf("1.纯英文.\n");
        printf("2.纯中文.\n");
        printf("3.中文英文混合.\n");
        printf("0.返回.\n"); 
        printf("********************\n");
        printf("您选择:");
        scanf("%d",&select);
        if(select==1)
        {
            fp=fopen("《cat and pig》.txt","r+");
        }
        if(select==2)
        {
            fp=fopen("《猫和猪》.txt","r+");
        }
        if(select==3)
        {
            fp=fopen("《猫和pig》.txt","r+");
        }
        if(select==0)
        {
            return 0;
        }
        while(!feof(fp))//直到读取到文件尾 
        {
            fscanf(fp,"%c",&ch[i]);
            i++;
        }
        i--; //here:你的EOF会被写入的,所以不建议用feof,要用的话要用do...while的
        fclose(fp);
        
        printf("已成功读取文本!!!\n");
        printf("请输入你要插入的字符串:");
        //fflush(stdin);
        getchar(); //here:某些编译器,fflush(stdin);不起作用,这个是最有效的
        gets(word);
        printf("请输入您要随机插入的次数:");
        scanf("%d",&n);
        lenth=i;//无\0,不能用strlen 
        ch[i]='\0'; //here:既然不能用不能用strlen,当然也不能用strcpy,加这个就可以了
        strcpy(ch1,ch);
        len=strlen(word);
        srand(time(NULL)); //使数据更随机 
       for(j=0;j<n;j++) //n次
        {
            pos=rand()%lenth; //确保pos<lenth
            printf("随机位置:%d",pos);
            printf("\n"); 
        k=0;
            for(i=0 ;i<pos;i++) //先拷贝原来pos前的
          chh[k++]=ch1[i];
        for(i=0;i<len;i++) //插入数据
          chh[k++]=word[i];
        for(i=pos;i<lenth;i++) //余下的
          chh[k++]=ch1[i];
        chh[k]='\0'; //字串结尾  
        strcpy(ch1,chh); //修改原串
        lenth=strlen(ch1); //修改原串长度
        }
        printf("%s\n",chh); //直接用%s就可以了
        printf("您已完成了插入,是否存盘?\n");
        printf("********************\n");
        printf("1.YES.\n");
        printf("2.NO.\n");
        printf("你选择:");
        scanf("%d",&select1);
        if(select1==1)
        {
         //   save(select,lenth+len*n,chh);//存盘 
        } 
        else
        {
            printf("程序结束!!"); 
            return 0;
        }
            
    } 
    int main()
    {
       insert();
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月4日
  • 已采纳回答 12月27日
  • 创建了问题 12月25日

悬赏问题

  • ¥15 preLaunchTask"C/C++: aarch64- apple-darwin22-g++-14 生成活动 文件”已终止,退出代码为-1。
  • ¥18 关于#贝叶斯概率#的问题:这篇文章中利用em算法求出了对数似然值作为概率表参数,然后进行概率表计算,这个概率表是怎样计算的呀
  • ¥20 C#上传XML格式数据
  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
  • ¥100 单片机hardfaulr
  • ¥20 手机截图相片分辨率降低一半
  • ¥50 求一段sql语句,遇到小难题了,可以50米解决
  • ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
  • ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
  • ¥15 虚拟机检测,可以是封装好的DLL,可付费