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

如何用C语言反转句子并转换为大写后输出?

问题修复与代码优化

原程序存在的问题

  • 输入读取不完整:scanf("%s")仅能读取到第一个空白字符(空格、换行等)之前的内容,无法获取完整句子。
  • 重复输出逻辑混乱:reverse函数内部通过putchar输出大写反转字符串,同时返回未转大写的反转字符串,main函数又通过printf输出该返回值,导致出现两次输出。
  • 未处理换行符:若后续改用整行读取,输入末尾的换行符会被带入字符串,影响最终输出。

修改后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char* reverseAndUpper(char* str);

int main(void) {
    char sentence[200];

    printf("enter a sentence: ");
    // 读取整行输入(包含空格)
    fgets(sentence, sizeof(sentence), stdin);
    
    // 去除末尾的换行符(如果存在)
    size_t len = strlen(sentence);
    if (len > 0 && sentence[len - 1] == '\n') {
        sentence[len - 1] = '\0';
    }
    
    char* result = reverseAndUpper(sentence);
    if (result != NULL) {
        printf("%s\n", result);
        free(result); // 释放动态分配的内存
    }

    return 0;
}

char* reverseAndUpper(char *str) {
    size_t len = strlen(str);
    char* reversedUpper = malloc(sizeof(char) * (len + 1));

    if (reversedUpper == NULL) {
        return NULL; // 内存分配失败时返回空指针
    }

    size_t j = 0;
    // 从字符串末尾遍历,同时转换为大写并填充到新数组
    for (size_t i = len; i > 0; i--) {
        reversedUpper[j++] = toupper(str[i - 1]);
    }
    reversedUpper[j] = '\0'; // 添加字符串结束标记

    return reversedUpper;
}

关键修改说明

  1. 整行输入读取:用fgets替代scanf,支持读取包含空格的完整句子,参数sizeof(sentence)确保不会超出缓冲区范围。
  2. 换行符处理:检查字符串末尾是否为换行符,若存在则替换为'\0',避免反转后输出开头出现换行。
  3. 函数职责单一化:将反转与转大写逻辑合并到reverseAndUpper函数,仅负责生成处理后的字符串,输出逻辑交由main函数执行,避免重复输出。
  4. 内存管理:main函数中调用free释放malloc分配的内存,避免内存泄漏;增加内存分配失败的判断,提升程序健壮性。

运行示例

输入:

enter a sentence: hello world

输出:

DLROW OLLEH

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:35:27