C语言运行时输入字符串传递给文件替换函数不生效问题求解
问题原因
- 输入缓冲区残留换行导致匹配失败
你之前用scanf("%s", file)读取文件名后,用户输入的回车符会残留在输入缓冲区中。后续执行scanf("%[^.]%*c",a)时,%[^.]会将残留的回车符作为第一个字符读入字符串a,最终a的实际内容是\n2,2,2,2,2,和文件中存储的2,2,2,2,2完全不匹配,因此strstr找不到目标内容,不会执行替换。 - 测试文件无目标匹配行
你提供的测试文件中本身不存在2,2,2,2,2的内容,就算输入逻辑正常也无法触发替换。 - javitas函数本身存在逻辑缺陷
当前替换逻辑是子串模糊匹配,而非整行匹配,只要某行中包含待替换子串就会被修改,不符合你修改指定整行的需求;同时回写原文件时用r+模式打开,若替换后文件总长度小于原长度,原文件末尾会残留旧内容。
解决方法
- 修复输入读取逻辑
读取待替换和目标字符串前,先清空输入缓冲区的残留空白字符,最简单的方式是在scanf的格式符前加空格,空格会自动跳过所有换行、空格等空白字符:
printf("Give the line you want to modify\n"); scanf(" %[^.]%*c",a); // 格式符前加空格 printf("Give the line you want to modify to\n"); scanf(" %[^.]%*c",b); // 格式符前加空格
- 测试前先在目标文件中添加
2,2,2,2,2行,验证替换效果。 - 优化javitas函数逻辑(可选,按需修改)
如果需要整行匹配替换,修改匹配逻辑,同时修复回写残留问题:
#define sorhossz 500 void javitas(char filename1[], char filename2[], const char *str, const char *replace) { FILE *in = fopen(filename1,"r"); FILE *out = fopen(filename2,"w"); char line[sorhossz]; size_t str_len = strlen(str); while (fgets(line, sizeof(line), in)) { // 去掉行尾的换行符 size_t line_len = strlen(line); if (line_len > 0 && line[line_len-1] == '\n') { line[line_len-1] = '\0'; line_len--; } // 整行完全匹配才替换 if (line_len == str_len && strcmp(line, str) == 0) { fprintf(out, "%s\n", replace); } else { fprintf(out, "%s\n", line); } } fclose(in); fclose(out); // 直接用临时文件覆盖原文件,避免r+模式的残留问题 remove(filename1); rename(filename2, filename1); }
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

