问题描述
该问题分为三个部分:“ 想法”,“ 假设”和“ 代码MRE ”,以便您可以有助于清晰,快速,轻松地指出我的愚蠢,并且由于按照频率从高到低的顺序,大多数错误都在于算法,实现过程中的假设以及实际代码中。
想法:
- 在文件中解析每个空白字符(
' ' or '\t' or '\n' or '\0'
,递增i
并将空白字符存储在int arrEOW[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字符存储。 - 即使一点点的扭曲,计数器
i
和q
的使用和递增以及访问数组元素的用法都是正确的。
代码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
。