C语言反转字符串后无法打印输出,请问问题出在哪里?
故障原因
- 核心错误是反转的右边界索引错误:
strlen()返回的是字符串不含末尾\0的有效长度,示例中字符串krishna的有效长度为7,对应数组合法下标范围是0~6,p[7]是字符串终止符\0。第一次循环时就把p[0]和\0交换,导致字符串首字符变为终止符,printf读入首字符就判定字符串结束,因此无任何输出。修复方案是将strrv函数中l的初始值改为strlen(p) - 1。 - 存在函数未前置声明的问题:
strrv定义在main之后,调用前未做声明,编译器会默认按返回int类型的函数处理,和实际的void返回值定义不匹配,属于未定义行为,也可能导致运行异常。修复方案是在main前补充void strrv(char p[]);的函数声明,或者把strrv的定义挪到main之前。 main函数写法不符合标准C规范:标准写法应为int main(void),执行结束需返回0,旧的隐式int写法在高版本C标准中已被废弃。
修复后的完整代码
#include <stdio.h> #include <string.h> // 前置声明函数 void strrv(char p[]); int main(void) { char p[] = "krishna"; strrv(p); printf("%s", p); return 0; } void strrv(char p[]) { // 右边界取有效长度减1,跳过末尾的\0 int l = strlen(p) - 1; int i = 0; char tmp; while(i < l) { tmp = p[i]; p[i] = p[l]; p[l] = tmp; i++; l--; } }
内容的提问来源于stack exchange,提问作者myquest
相关产品推荐
相关产品推荐

