文本单词反转功能实现问题:C语言代码调试求助
单词反转功能的C语言代码调试修正
功能需求
实现文本中单词反转功能,规则是按空格分隔单词,每个单词的字符顺序反转(包含标点符号),示例如下:
输入文本:
I love you. You love me. We're a happy family.
期望输出:
I evol .uoy uoY evol .em er'eW a yppah .ylimaf
原实现思路(翻译整理)
原计划思路:
- 打开并读取文件内容到数组
- 跳过文本中的空格字符
- 动态调整数组内存大小以匹配实际元素数量
- 通过递增索引并重置标记的方式,在循环中反转相邻元素
原代码问题分析
原代码存在多处逻辑错误和未定义行为:
- 变量
inc、inc_reset未初始化,直接累加会导致内存访问异常 - 未正确识别单词边界,仅跳过空格但未区分不同单词,无法实现按单词反转
realloc的使用逻辑错误,inc += i的计算方式完全不符合内存分配需求store_i数组的设计无意义,后续遍历会处理大量无效数据- 反转逻辑错误,
var[j] = var[j+1]是字符移位而非反转 - 未将修改后的内容写回文件,读取后没有完成写入操作
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #define MAX_READ 100 // 反转指定区间内的字符 void reverse_word(char *start, char *end) { char temp; while (start < end) { temp = *start; *start = *end; *end = temp; start++; end--; } } int main() { int fd; // 以读写模式打开文件,不存在则报错 fd = open("files/text_1.txt", O_RDWR); if (fd == -1) { perror("Failed to open file"); exit(EXIT_FAILURE); } char buffer[MAX_READ + 1]; ssize_t numRead; // 读取文件内容到缓冲区 numRead = read(fd, buffer, MAX_READ); if (numRead == -1) { perror("Failed to read file"); exit(EXIT_FAILURE); } buffer[numRead] = '\0'; // 添加字符串结束符 // 遍历缓冲区,识别单词并反转 char *word_start = buffer; for (int i = 0; i <= numRead; i++) { // 遇到空格、换行或字符串结束符,视为单词结束 if (buffer[i] == ' ' || buffer[i] == '\n' || buffer[i] == '\0') { if (word_start != &buffer[i]) { // 避免空单词(连续空格的情况) reverse_word(word_start, &buffer[i] - 1); } word_start = &buffer[i + 1]; // 更新下一个单词的起始位置 } } // 将修改后的内容写回文件:先定位到文件开头,再写入 if (lseek(fd, 0, SEEK_SET) == -1) { perror("Failed to seek file"); exit(EXIT_FAILURE); } ssize_t numWritten = write(fd, buffer, numRead); if (numWritten == -1 || numWritten != numRead) { perror("Failed to write file"); exit(EXIT_FAILURE); } if (close(fd) == -1) { perror("Failed to close file"); exit(EXIT_FAILURE); } return 0; }
关键修正说明
- 新增
reverse_word函数:专门负责反转指定区间内的字符,逻辑清晰易维护 - 正确识别单词边界:以空格、换行符或字符串结束符作为单词分隔符,确保每个独立单词被反转
- 修复文件写入逻辑:读取内容修改后,通过
lseek定位到文件开头,再写入修改后的缓冲区 - 替换模糊的错误提示为
perror:可以输出具体的系统错误信息,便于调试 - 去除无效的动态内存分配逻辑:原思路中的
malloc/realloc使用不当,改用固定缓冲区(若需支持大文件可后续扩展动态内存)
内容的提问来源于stack exchange,提问作者Emil11
相关产品推荐
相关产品推荐

