尝试替换文件中的单词时发生奇怪的故障

问题描述

该问题分为三个部分:“ 想法”,“ 假设”和“ 代码MRE ”,以便您可以有助于清晰,快速,轻松地指出我的愚蠢,并且由于按照频率从高到低的顺序,大多数错误都在于算法,实现过程中的假设以及实际代码中。

想法:

  • 文件中解析每个空白字符(' ' or '\t' or '\n' or '\0',递增i并将空白字符存储在int arr EOW[i]中(这样\0可以被阅读)。
  • 倒退FILE *int q =1;
  • 对于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值存储,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;
}

解决方法

    else if(ch==' '||ch=='\t'||ch=='\n'||ch == '\0')
        i++;EOW[i]=ch;

这缺少{ ... }大括号,导致EOW[i]=ch;掉到{em> {1>}之外。

else if

假设 for(int q=1; q<i; q++){ 的编号方式,使q <= i否则将跳过最后一个元素。

EOW

无关,但您可以将其设为 int EOW[100000];,因为没有充分的理由使它成为char EOW