C语言反转字符串后printf输出空串,求问题原因及解决
字符串反转代码的问题分析与修复
你的代码存在三个关键问题,导致printf输出为空:
- 未初始化的指针:
char *rvsd;仅声明了指针,未分配任何内存空间。直接对rvsd[i]赋值属于访问非法内存,触发未定义行为。 - 索引初始值错误:
right初始化为strlen(str),而字符串最后一个有效字符的索引是strlen(str)-1,第一次赋值会把字符串结束符'\0'放到rvsd[0]的位置,printf遇到结束符直接停止输出,自然显示为空。 - 循环范围不当:
i<=slen会让循环执行slen+1次,超出字符串长度,引发内存越界。
修复方案1:动态分配内存
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char str[50] = "geeksforgeeks"; // 分配足够内存(含结束符) char *rvsd = malloc(strlen(str) + 1); if (!rvsd) { printf("内存分配失败\n"); return 1; } int slen = strlen(str); int right = slen - 1; for(int i = 0; i < slen; i++) { rvsd[i] = str[right]; right--; } rvsd[slen] = '\0'; // 手动添加字符串结束符 printf("%s\n", rvsd); free(rvsd); // 释放内存 return 0; }
修复方案2:使用栈上数组(更简单)
#include <stdio.h> #include <string.h> int main() { char str[50] = "geeksforgeeks"; char rvsd[50]; // 直接声明足够大的数组 int slen = strlen(str); int right = slen - 1; for(int i = 0; i < slen; i++) { rvsd[i] = str[right]; right--; } rvsd[slen] = '\0'; printf("%s\n", rvsd); return 0; }
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

