c - 尝试替换文件中的单词时出现奇怪的故障
问题描述
这个问题分为 3 个部分:“想法”、“假设”和“代码 MRE ”,以便您可以帮助您清楚、快速、轻松地指出我的愚蠢之处,而且按照频率降序排列,大多数错误在于算法,在实现过程中所做的假设,然后在实际代码中。
理念:
- 解析文件,在每个空格 char ( 处
' ' or '\t' or '\n' or '\0'
,增加空格 chari
并将其存储在 int arr 中EOW[i]
(以便甚至\0
可以读取)。 - 倒带
FILE *
。int q =1;
- 对于 int
q
<i
: fscanf()
每个单词(单词 = 由空格字符分隔的字符序列)并存储到buffer[]
.- 如果
strcmp(buffer, target)==0
那么strcpy(buffer, replacement)
。 fprintf()
buffer 后跟 char atEOW[q]
到临时文件。- 删除原始文件并重命名临时文件。
假设:
fscanf(%s)
将扫描并存储字符,直到遇到' '
,'\t'
,'\n'
和'\0'
chars。char
当存储到int
arr 时存储为其 ASCII val,存储到时 arr 的元素int
存储char
为其 ASCII 字符。- 计数器的使用和递增
i
以及q
访问数组元素的使用是正确的,即使有点扭曲。
代码 MRE:
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;
落在.else if
for(int q=1; q<i; q++){
否则q <= i
它会跳过最后一个元素,因为它EOW
是如何编号的。
int EOW[100000];
不相关,但您可以这样做,char EOW
因为它没有充分的理由成为int
.
推荐阅读
- mqtt - 前几条消息在传输到离线的 mqtt 客户端时丢失
- java - 拦截休眠事件时出错
- python - python OSError:dlopen:找不到合适的图像。麦克M1
- javascript - 如何从具有多个页面的表中获取表记录?
- r - 如何将每行包含多个值的列分成多列
- javascript - 根据发布请求数据更改日历 CSS
- c++ - 菜单栏功能在 Qt 中不起作用
- android - 意外的输入类型。仅支持存档类型,例如 .jar、.zip 等。 Android
- java - 检查java中是否有调用特定服务的方法
- javascript - react-native-animated 中的 useTheme 和 useDerived 钩子