如何用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; }
关键修改说明
- 整行输入读取:用
fgets替代scanf,支持读取包含空格的完整句子,参数sizeof(sentence)确保不会超出缓冲区范围。 - 换行符处理:检查字符串末尾是否为换行符,若存在则替换为
'\0',避免反转后输出开头出现换行。 - 函数职责单一化:将反转与转大写逻辑合并到
reverseAndUpper函数,仅负责生成处理后的字符串,输出逻辑交由main函数执行,避免重复输出。 - 内存管理:main函数中调用
free释放malloc分配的内存,避免内存泄漏;增加内存分配失败的判断,提升程序健壮性。
运行示例
输入:
enter a sentence: hello world
输出:
DLROW OLLEH
内容的提问来源于stack exchange,提问作者Karaoki
相关产品推荐
相关产品推荐

