【发布时间】:2020-12-11 18:25:25
【问题描述】:
此问题分为 3 个部分:'The Idea'、'Assumptions' 和 'Code MRE',以便您可以帮助清楚、快速、轻松地指出我的错误,而且按照频率降序排列,大多数错误出在算法、实现过程中的假设以及实际代码中。
理念:
- 在每个空格字符处解析文件(
' ' or '\t' or '\n' or '\0',递增i并将空格字符存储在 int arrEOW[i]中(这样即使\0也可以读取)。 - 倒带
FILE *。int q =1; - for int
qi: -
fscanf()每个单词(单词 = 由空格字符分隔的字符序列)并存储到buffer[]。 - 如果是
strcmp(buffer, target)==0,那么是strcpy(buffer, replacement)。 -
fprintf()缓冲区紧跟EOW[q]处的 char 到临时文件。 - 删除原始文件并重命名临时文件。
假设:
-
fscanf(%s)将扫描并存储字符,直到遇到' '、'\t'、'\n'和'\0'字符。 -
char存储到int时,arr 存储为其 ASCII val,intarr 的元素存储到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;
}
【问题讨论】:
-
举个例子来说明我得到的问题:提供一个带有
to be or not to be, that is the question.\n的文件并要求它用'(to)'替换'to'导致(to)eberortnoto(to),be,tthatsisethe.(末尾没有换行符)。 -
如果
target和replacement大小不同 -- 文件损坏。 -
@DavidC.Rankin 绝对不是。这正是我使用
strcpy()notstrcat()的原因。
标签: c string file-io scanf text-parsing