You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言截取argv前两字符存入数组后打印出现乱码问题

解决printf输出乱码的问题

嘿,这个问题我之前也踩过坑!核心原因其实很简单:C语言里的字符串必须以空字符'\0'作为结束标记,而你定义的salt[2]只装了两个目标字符,根本没预留位置放终止符。printf("%s")会从数组起始位置一直读取内存,直到碰巧找到某个随机的'\0'才停下,那些莫名其妙的乱码就是这么来的。

给你几个实用的解决方案:

方案1:调整数组大小,手动添加终止符

直接把数组长度改成3,专门留个位置放'\0',这样printf就能正确识别字符串边界:

#include <stdio.h>

int main (int argc, char *argv[]) {
    // 先判断有没有传入参数,避免访问空指针导致崩溃
    if (argc < 2) {
        printf("请传入一个参数\n");
        return 1;
    }
    char salt[3] = {argv[1][0], argv[1][1], '\0'};
    printf("%s\n", salt);
    return 0;
}

方案2:直接输出单个字符,跳过字符串依赖

既然只需要输出两个字符,完全不用折腾字符串,直接用%c格式符分别打印就行:

#include <stdio.h>

int main (int argc, char *argv[]) {
    if (argc < 2) {
        printf("请传入一个参数\n");
        return 1;
    }
    printf("%c%c\n", argv[1][0], argv[1][1]);
    return 0;
}

方案3:用strncpy安全复制(适合复杂场景)

如果之后还要对这个子串做字符串操作,用strncpy更规范,记得手动补终止符(strncpy不会自动添加):

#include <stdio.h>
#include <string.h>

int main (int argc, char *argv[]) {
    if (argc < 2) {
        printf("请传入一个参数\n");
        return 1;
    }
    char salt[3];
    // 最多复制2个字符到salt数组
    strncpy(salt, argv[1], 2);
    // 手动添加终止符,确保是合法字符串
    salt[2] = '\0';
    printf("%s\n", salt);
    return 0;
}

另外别忘了加参数判断哦,要是用户运行程序时没传参数,argv[1]就是空指针,直接访问会导致程序崩溃的。

内容的提问来源于stack exchange,提问作者jwsandwich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:27:13