【问题标题】:Odd glitches occurring when trying to replace word in a file尝试替换文件中的单词时出现奇怪的故障
【发布时间】:2020-12-11 18:25:25
【问题描述】:

此问题分为 3 个部分:'The Idea'、'Assumptions' 和 'Code MRE',以便您可以帮助清楚、快速、轻松地指出我的错误,而且按照频率降序排列,大多数错误出在算法、实现过程中的假设以及实际代码中。

理念:

  • 在每个空格字符处解析文件(' ' or '\t' or '\n' or '\0',递增 i 并将空格字符存储在 int arr EOW[i] 中(这样即使\0 也可以读取)。
  • 倒带FILE *int q =1;
  • for int q i:
  • fscanf() 每个单词(单词 = 由空格字符分隔的字符序列)并存储到 buffer[]
  • 如果是strcmp(buffer, target)==0,那么是strcpy(buffer, replacement)
  • fprintf() 缓冲区紧跟 EOW[q] 处的 char 到临时文件。
  • 删除原始文件并重命名临时文件。

假设:

  • fscanf(%s) 将扫描并存储字符,直到遇到 ' ''\t''\n''\0' 字符。
  • char 存储到 int 时,arr 存储为其 ASCII val,int arr 的元素存储到 char 时存储为其 ASCII 字符。
  • 计数器 iq 的使用和递增以及访问数组元素的使用是正确的,即使有点扭曲。

代码 M.R.E

int main(){
    char frep[261]; getf scanf("%260[^\n]",frep);eat(); // stores fname in frep[], clears stdin
    FILE * rep = fopen(frep,"r");FILE * tmp = fopen("Temp.Ctt","w");// opens file for reading and tmp for writing
    if(rep==NULL||tmp==NULL){
        perror("\nError ");fclose(rep);fclose(tmp);
    }
    else{
        char target[501]; printf("\n Target : "); scanf("%500s",target);eat(); // gets target word
        char replace[501]; printf("\n Replacement : "); scanf("%500[^\n]",replace);eat();// gets its replacement
        char buffer[501]; long long i=0; int EOW[100000];
        while(1){
            char ch = fgetc(rep);
            if(ch==EOF)
                break; // breaks loop if EOF reached
            else if(ch==' '||ch=='\t'||ch=='\n'||ch == '\0')
                i++;EOW[i]=ch;
        }
        rewind(rep);
        for(int q=1; q<i; q++){
                fscanf(rep,"%500s",buffer);
                if(strcmp(target,buffer)==0)
                    strcpy(buffer,replace);
                fprintf(tmp,"%s%c",buffer,EOW[q]);
        }
        fclose(rep);fclose(tmp);
        remove(frep); rename("Temp.Ctt",frep);
        printf("\nSucess.\n\nReplaced any instances of \"%s\" with \"%s\".\n",target,replace);
    }
    
    return 0;
}

【问题讨论】:

  • 举个例子来说明我得到的问题:提供一个带有to be or not to be, that is the question.\n的文件并要求它用'(to)'替换'to'导致(to)eberortnoto(to),be,tthatsisethe.末尾没有换行符)。
  • 如果 targetreplacement 大小不同 -- 文件损坏。
  • @DavidC.Rankin 绝对不是。这正是我使用 strcpy() not strcat() 的原因。

标签: c string file-io scanf text-parsing


【解决方案1】:
    else if(ch==' '||ch=='\t'||ch=='\n'||ch == '\0')
        i++;EOW[i]=ch;

这缺少{ ... } 大括号,导致EOW[i]=ch; 落在else if 之外

    for(int q=1; q<i; q++){

根据EOW 的编号方式,设置q &lt;= i,否则它会跳过最后一个元素。

int EOW[100000];

不相关,但您可以将其设为 char EOW,因为没有充分理由将其设为 int

【讨论】:

  • 感谢 dxiv。我自己已经弄清楚了第一点,但它只是用替换替换每个单词,我不知道为什么。我查看了您对q 的建议,然后将其设为for( int q=0; q&lt;I;q++),而只是使用EOW[q+1],并将EOW[] 设为字符arr,因为您的观点很好,现在,它正在工作...我不知道为什么,但它不再取代一切......
猜你喜欢
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多