用c语言输出 从键盘输入一个字符串,将该字符串逆序输出。例如,输入“hello”,输出“olleh”。
首先,我得知道如何从键盘获取字符串输入。在C语言里,可以用scanf或者gets,不过gets可能不安全,容易导致缓冲区溢出。或者用fgets,这样可以指定读取的长度,更安全一些。比如定义一个字符数组,比如char str[100],然后用fgets(str, sizeof(str), stdin)来读取输入。不过要注意,fgets会包括换行符,所以可能需要处理一下末尾的换行符。
接下来,如何逆序字符串呢?常见的做法有两种:一种是创建一个新的数组,从原字符串的末尾开始逐个字符复制到新数组的开头;另一种是直接在原数组上进行交换,比如首尾字符交换,直到中间位置。这样不需要额外空间,效率更高。
比如,假设字符串长度是n,那么可以定义两个下标,i从0开始,j从n-1开始,然后交换str[i]和str[j],直到i >= j。这样就完成了逆序。
不过首先要确定字符串的实际长度。可以用strlen函数,但要注意它返回的是不包括结束符'\0'的长度。比如,如果输入是“hello”,strlen返回5,索引0到4。所以j应该是4,也就是strlen(str)-1。不过如果有换行符的话,可能需要先去掉,比如用strchr找到换行符的位置,替换成'\0'。
那具体步骤大概是这样的:读取字符串,去除可能的换行符,计算长度,然后交换首尾字符,最后输出逆序后的字符串。
然后测试一下,比如输入hello,交换后应该是olleh。如果输入的字符串长度是偶数或奇数,交换逻辑都应该适用。比如test变成tset,长度为4,交换索引0和3,1和2。
不过要处理空字符串的情况吗?如果用户直接输入回车,这时候字符串长度是0,程序应该不会有问题,因为循环不会执行。
然后考虑代码的结构。首先声明一个足够大的字符数组,比如100个字符。然后提示用户输入,读取输入,处理换行符,计算长度,进行逆序操作,最后输出结果。
可能的错误点:忘记处理换行符,导致逆序后的字符串末尾有换行符或者原换行符影响长度计算。或者交换时没有正确计算长度,比如使用sizeof(str)而不是strlen,这样可能会包括未初始化的内存区域,导致错误。
所以具体代码的大致流程:
- 包含必要的头文件,比如stdio.h和string.h。
- main函数里定义字符数组str,长度100。
- 提示用户输入字符串。
- 使用fgets读取输入。
- 查找字符串中的换行符,如果有的话替换成'\0'。
- 计算字符串长度len。
- 使用循环,i从0到len/2,交换str[i]和str[len-1-i]。
- 最后输出逆序后的字符串。
测试一下这个流程是否正确。例如输入hello:
- fgets读取后,str的内容是"hello\n\0",然后替换换行符为'\0',变成"hello\0"。len是5。
- 循环i从0到2(因为5/2=2.5,整数除法是2),交换i=0和4,i=1和3。i=2的时候,交换i=2和2(自己),所以不影响。
- 结果字符串变为o,l,l,e,h → olleh。
这样应该没问题。那代码大致就是这样:
#include <stdio.h> #include <string.h>
int main() { char str[100]; printf("请输入一个字符串:"); fgets(str, sizeof(str), stdin); // 去除换行符 char *pos = strchr(str, '\n'); if (pos) *pos = '\0'; int len = strlen(str); for (int i = 0; i < len / 2; i++) { char temp = str[i]; str[i] = str[len - 1 - i]; str[len - 1 - i] = temp; } printf("逆序后的字符串:%s\n", str); return 0; }
这样应该可以正确运行。用户输入hello后,输出olleh。再考虑其他情况,比如空字符串,或者单个字符,比如输入a,逆序还是a。或者输入ab,交换后变成ba。这些都是正确的。
可能需要注意的还有,如果输入的字符串长度超过数组大小减一(比如数组是100,用户输入超过99个字符),fgets会截断,但剩下的字符会留在输入缓冲区,可能影响后续输入,但在这个简单程序里可能没问题,因为程序结束后就退出了。
综上,这样的代码应该能满足用户的需求。要实现将输入的字符串逆序输出,可以按照以下步骤进行:
步骤分析
- 读取字符串:使用
fgets
安全地获取用户输入(避免缓冲区溢出) - 去除换行符:
fgets
会保留输入时的换行符,需手动清除 - 逆序逻辑:通过首尾字符交换实现原地逆序
- 输出结果
完整代码
#include <stdio.h>
#include <string.h>
int main() {
char str[100]; // 定义足够大的字符数组存储输入
printf("请输入一个字符串:");
// 安全读取输入(含空格也能处理)
fgets(str, sizeof(str), stdin);
// 去除末尾的换行符
char *newline = strchr(str, '\n');
if (newline) *newline = '\0';
// 计算字符串长度
int length = strlen(str);
// 首尾交换实现逆序
for (int i = 0; i < length / 2; i++) {
char temp = str[i];
str[i] = str[length - 1 - i];
str[length - 1 - i] = temp;
}
printf("逆序结果:%s\n", str);
return 0;
}
代码解释
读取输入
- 使用
fgets(str, sizeof(str), stdin)
确保不会读取超过数组容量。 - 例如输入
hello
,实际存储为hello\n\0
。
- 使用
处理换行符
strchr(str, '\n')
查找换行符位置,替换为终止符\0
,使字符串变为hello\0
。
逆序算法
- 通过循环交换首尾字符:
- 第1次交换:
h
(索引0)与o
(索引4) - 第2次交换:
e
(索引1)与l
(索引3) - 中间字符
l
(索引2)无需处理
- 第1次交换:
- 时间复杂度:$O(n/2)$,效率高。
- 通过循环交换首尾字符:
输出结果
- 直接打印修改后的原数组
str
,得到olleh
。
- 直接打印修改后的原数组
测试示例
- 输入:
hello
输出:olleh
- 输入:
12345
输出:54321
注意事项
- 如果输入超过数组容量(如100字符),
fgets
会截断多余内容。 - 此方法直接修改原字符串,无需额外内存空间。
相关推荐


















