You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在二维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

火山引擎 最新活动