C语言生成反转字符串副本时打印整个字符串为空如何解决
问题原因
你的代码存在3个核心错误,共同导致最终temp字符串打印为空:
- 初始下标取值错误:
strlen(str)返回的是字符串有效字符长度,不包含末尾的\0结束符,因此str[j]初始就是\0,你第一遍循环就把\0复制到了temp[0]的位置。单个字符打印%c不会识别字符串结束符,所以逐字打印正常,但打印整个字符串时碰到首字符\0会直接终止输出,因此temp打印为空。 - 循环逻辑与复制逻辑不合理:你使用
strcpy复制单个字符完全是多余操作,strcpy会从源地址一直复制到\0为止,不仅效率极低还会引发不必要的内存写入。且循环条件str[j] - 1逻辑混乱,极易出现越界。 - 未手动补字符串结束符:即便你反转复制了所有有效字符,循环结束后也没有给temp追加
\0,会导致temp是非法的C字符串,打印时会出现乱码或者异常截断。
修正代码
#include <stdio.h> #include <string.h> int main(void) { char str[101] = "Lieur a Rueil"; char temp[101]; int i = 0; // 初始j指向最后一个有效字符的下标 int j = strlen(str) - 1; // 循环到字符串开头为止 while (j >= 0) { // 直接赋值单个字符即可,不需要strcpy temp[i] = str[j]; printf("%c", temp[i]); j--; i++; } // 手动补充字符串结束符 temp[i] = '\0'; printf("\n"); printf("temp: %s\n", temp); return 0; }
运行输出
lieuR a rueiL temp: lieuR a rueiL
内容的提问来源于stack exchange,提问作者Balou
相关产品推荐
相关产品推荐

