You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

文本单词反转功能实现问题:C语言代码调试求助

单词反转功能的C语言代码调试修正

功能需求

实现文本中单词反转功能,规则是按空格分隔单词,每个单词的字符顺序反转(包含标点符号),示例如下:

输入文本:

I love you.
You love me.
We're a happy family.

期望输出:

I evol .uoy
uoY evol .em
er'eW a yppah .ylimaf

原实现思路(翻译整理)

原计划思路:

  • 打开并读取文件内容到数组
  • 跳过文本中的空格字符
  • 动态调整数组内存大小以匹配实际元素数量
  • 通过递增索引并重置标记的方式,在循环中反转相邻元素

原代码问题分析

原代码存在多处逻辑错误和未定义行为:

  1. 变量inc、inc_reset未初始化,直接累加会导致内存访问异常
  2. 未正确识别单词边界,仅跳过空格但未区分不同单词,无法实现按单词反转
  3. realloc的使用逻辑错误,inc += i的计算方式完全不符合内存分配需求
  4. store_i数组的设计无意义,后续遍历会处理大量无效数据
  5. 反转逻辑错误,var[j] = var[j+1]是字符移位而非反转
  6. 未将修改后的内容写回文件,读取后没有完成写入操作

修正后的代码

#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;
}

关键修正说明

  1. 新增reverse_word函数:专门负责反转指定区间内的字符,逻辑清晰易维护
  2. 正确识别单词边界:以空格、换行符或字符串结束符作为单词分隔符,确保每个独立单词被反转
  3. 修复文件写入逻辑:读取内容修改后,通过lseek定位到文件开头,再写入修改后的缓冲区
  4. 替换模糊的错误提示为perror:可以输出具体的系统错误信息,便于调试
  5. 去除无效的动态内存分配逻辑:原思路中的malloc/realloc使用不当,改用固定缓冲区(若需支持大文件可后续扩展动态内存)

内容的提问来源于stack exchange,提问作者Emil11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 00:05:34