如何在二维char数组中正确打印字符串?
如何在二维char数组中正确打印字符串?
嘿,我来帮你搞定这个乱码问题!你现在遇到的情况,根源是给二维char数组赋值的方式完全错误,咱们一步步理清楚:
首先看你写的这段代码:
int main() { char str[5][80]; str[1][80] = "hello world"; printf("%s", str[1]); }
这里的问题有两个:
str[1][80]是str[1]这个char数组的第81个元素(数组下标从0开始,str[1]的合法下标是0到79),你直接给单个char元素赋值字符串字面量的地址,类型完全不匹配,而且还越界访问了数组。- 就算你写的是
str[1] = "hello world";也不行,因为数组名是常量指针,不能直接用赋值号把字符串字面量赋值给它。
接下来给你两种正确的解决方法:
方法一:初始化时直接赋值
如果是在定义数组的时候就确定字符串内容,可以直接这样写:
int main() { // 给第2行(下标为1的行)赋值"hello world",其他行留空 char str[5][80] = {"", "hello world"}; printf("%s", str[1]); return 0; }
编译器会自动把字符串复制到str[1]对应的数组空间里,还会自动加上字符串结束符\0,这样用printf("%s")就能直接输出正确内容。
方法二:用strcpy函数动态赋值
如果需要在程序运行过程中给数组赋值,就得用标准库的strcpy函数,记得要包含<string.h>头文件:
#include <string.h> int main() { char str[5][80]; // 把"hello world"复制到str[1]这个数组中 strcpy(str[1], "hello world"); // 直接打印字符串 printf("%s\n", str[1]); // 用循环逐个字符打印也能正常输出了 for (int i = 0; i < 80 ;++i) { printf("%c", str[1][i]); } return 0; }
strcpy会把字符串完整复制到目标数组,包括结束符\0,这样不管是直接打印字符串还是循环打印每个字符,都不会出现乱码了。
内容来源于stack exchange




