wiiwwn 2021-11-17 01:01 采纳率: 100%
浏览 95
已结题

怎么在c语言中把一个文本的数字全部翻倍

img

按格式除了0017其他的数字全部翻倍,并且翻倍后的数字能按照原本的格式正常的输出

  • 写回答

2条回答 默认 最新

  • 广大菜鸟 2021-11-17 01:37
    关注

    2种方法:第一种根据数据是否有花括号的区别,第二种根据标签

    <string>
    

    这样选择

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAXSIZE 1024
    int isDigit(char c)
    {
        return (int)c <= (int)'9' && (int)c >= (int)'0' ? 1 : 0;
    }
    //根据标签值有无花括号作为区别
    void outputString(char *line)
    {
        int len = strlen(line), i = 0;
        char buffer[MAXSIZE] = "\0"; //缓冲区
        int mark = 0;
        int j = 0;
        int value;
        for (i = 0; i < len; i++)
        {
            if (line[i] == '{')
            {
                printf("%c", line[i]);
                mark += 1;
            }
            else if (line[i] == '}' && j > 0)
            {
                mark -= 1;
                buffer[j] = '\0';
                // str -> int
                value = atoi(buffer);
                printf("%d", 2 * value);
                printf("%c", line[i]);
                j = 0;
            }
            else if (mark > 0 && isDigit(line[i]))
            {
                buffer[j++] = line[i];
            }
            else if (mark > 0 && line[i] == ',' && j > 0)
            {
                buffer[j] = '\0';
                // str -> int
                value = atoi(buffer);
                printf("%d", 2 * value);
                printf("%c", line[i]);
                j = 0;
            }
            else
            {
                printf("%c", line[i]);
            }
        }
    }
    
    //根据标签作为区别
    void outputString1(char *line, char *targetMark)
    {
        int len = strlen(line), i = 0;
        char numBuffer[MAXSIZE] = "\0";  //缓冲区
        char markBuffer[MAXSIZE] = "\0"; //标签
        int label_mark = 0, num_mark = 0, target_mark = 0;//表示 是否为标签范围、数字范围、目标标签
        int m_j = 0, n_j = 0; //标签表示,数字表示
        int value;
        for (i = 0; i < len; i++)
        {
            if (line[i] == '<')
            {
                label_mark = 1;
                m_j = 0;
                markBuffer[m_j++] = line[i];
                printf("%c", line[i]);
            }
            else if (label_mark == 1)
            {
                markBuffer[m_j++] = line[i];
                printf("%c", line[i]);
                if (line[i] == '>')
                {
                    label_mark = 0;
                    markBuffer[m_j] = '\0';
                    m_j = 0;
                    if(strcmp(markBuffer,targetMark)==0){
                        target_mark  = 1;
                    }
                }
            }else if(target_mark==1&&isDigit(line[i])){
                numBuffer[num_mark++] = line[i];
            }else if(target_mark==1&&num_mark>0&&!isDigit(line[i])){
                numBuffer[num_mark]='\0';num_mark=0;
                // str -> int *2 -> output
                value = atoi(numBuffer);
                printf("%d", 2 * value);
                printf("%c",line[i]);
            } else{
                printf("%c",line[i]);
            }
        }
    }
    
    int main()
    {
        char line[MAXSIZE + 1] ;//= "<string>{{0,0},{140,44}}</string>";
        // outputString1(line, "<string>");
        // system("pause");
        char*filename="C:/Users/Lenovo/Desktop/1.xml";
        FILE*fp=fopen(filename,"r+");
        if(fp==NULL) return -1;
        while(!feof(fp)){
            fgets(line,MAXSIZE,fp);
            outputString1(line,"<string>");
        }
        printf("\n");
        fclose(fp);
    }
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月17日
  • 已采纳回答 11月17日
  • 创建了问题 11月17日

悬赏问题

  • ¥15 请求分析基于spring boot+vue的前后端分离的项目
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥20 为什么我写出来的绘图程序是这样的,有没有lao哥改一下
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?