C语言基于文件处理实现字符串反转及大小写互换的问题求助
原代码现存问题清单
- 函数名不匹配:
main中调用的inputOfAnString与实际定义的inputOfAString拼写差了一个字符,会直接触发编译错误 - 文件读取参数错误:
readTheString函数内调用fgets时,第三个参数错误传入了字符串形式的文件名,fgets要求传入已打开的FILE*类型文件指针,当前写法无法正常读取文件内容 - 循环读取逻辑错误:使用
while(!feof(fin))作为读循环判断条件属于经典误区——feof只有在读操作触发文件末尾后才会置位,会导致最后一轮循环重复读取残留字符串,造成输出内容重复 - 大小写转换逻辑完全失效:
- 判断条件写错:写为
s[i] == isupper(s[i]),实际isupper的功能是判断字符是否为大写、返回布尔值,正确写法是if(isupper((unsigned char)s[i])),当前判断永远无法成立 - 分支逻辑重复:if和else分支全部写了转小写的操作,完全没有实现小写转大写的互换要求
- 循环越界:写死遍历20个字符,但
fgets读到的字符串实际长度远小于20,会越界读取数组中未初始化的垃圾值并写入输出文件
- 判断条件写错:写为
- 缺失核心功能:完全没有实现题目要求的字符串反转逻辑
- 头文件缺失:使用了
isupper/tolower等函数,但没有引入<ctype.h>头文件,会触发隐式声明的编译警告 - 换行符处理缺失:
fgets会把用户输入时的换行符读入字符串,不做清除的话反转后换行符会跑到文件开头,造成格式错误
修正后的可运行代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> // 从控制台读字符串写入输入文件 void inputOfAString(const char* nameOfTheFile){ FILE *fin = fopen(nameOfTheFile, "w"); if(fin == NULL){ printf("File open error when writing input\n"); exit(1); } char s[1024]; // 扩大缓冲区适配更长的输入 fgets(s, sizeof(s), stdin); // 清除fgets读入的末尾换行符 size_t len = strlen(s); if(len > 0 && s[len-1] == '\n'){ s[len-1] = '\0'; } fprintf(fin, "%s", s); fclose(fin); } // 从输入文件读字符串,做大小写互换+反转后写入输出文件 void readTheString(const char *inputOfTheFile, const char* outputOfTheFile){ FILE *fin = fopen(inputOfTheFile, "r"); FILE *fout = fopen(outputOfTheFile, "w"); if(fout == NULL || fin == NULL){ printf("File open error when processing\n"); exit(1); } char s[1024]; // 直接判断fgets返回值,替代错误的feof判断 while(fgets(s, sizeof(s), fin) != NULL){ size_t len = strlen(s); // 清除行尾换行符 if(len > 0 && s[len-1] == '\n'){ s[len-1] = '\0'; len--; } // 第一步:遍历字符串做大小写互换 for(size_t i = 0; i < len; i++){ if(isupper((unsigned char)s[i])){ s[i] = tolower((unsigned char)s[i]); }else if(islower((unsigned char)s[i])){ s[i] = toupper((unsigned char)s[i]); } // 非字母字符保持原样 } // 第二步:从字符串末尾往前逐字符写入输出文件,实现反转效果 for(size_t i = len; i > 0; i--){ fputc(s[i-1], fout); } fputc('\n', fout); // 补回行尾换行,保证输出格式正常 } fclose(fin); fclose(fout); } int main(){ inputOfAString("input1.txt"); readTheString("input1.txt", "output1.txt"); return 0; }
运行效果验证
使用题目给定的测试用例校验:
- 控制台输入原始字符串
Aeroplane,程序首先将内容写入input1.txt - 处理阶段先完成大小写互换:
Aeroplane→aEROPLANE,再反转整个字符串,得到目标输出ENALPOREa,写入output1.txt,完全匹配题目要求的输出规则
内容的提问来源于stack exchange,提问作者Worst Vayne Antartic
相关产品推荐
相关产品推荐

