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

C语言程序命令行传递文件名后打印乱码,求原因及解决方法

问题原因及修正方案

你的代码存在多处错误,直接导致了乱码和未定义行为:

1. 变量类型定义错误

你声明的 char *nameDatei[100]; 是一个包含100个字符指针的数组,而非用来存储文件名的字符数组。正确的声明应该是能存储字符串的字符数组:

char nameDatei[100];

2. 数组下标越界

使用命令行参数时,nameDatei[100] = argv[1]; 存在严重的下标越界问题——数组的有效下标范围是 0 到 99,访问 nameDatei[100] 属于非法内存访问,会破坏程序内存布局,引发不可预测的结果。

3. 字符串赋值方式错误

即使变量类型正确,直接用指针赋值也不符合字符数组的操作逻辑,应该使用字符串复制函数 strcpy(或更安全的 strncpy)将命令行参数的内容复制到字符数组中,注意要包含头文件 <string.h>。

4. 打印参数错误

printf("%s", &nameDatei); 传递的是整个数组的地址,而非字符串的首地址。对于字符数组来说,直接传递数组名 nameDatei 就是字符串的首地址,&nameDatei 是数组的指针,用 %s 打印会读取错误的内存区域,导致乱码。

修正后的代码

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

int main(int argc, char* argv[]){

    char nameDatei[100];
    
    if(argc > 1) { // 用参数个数判断更严谨
        strncpy(nameDatei, argv[1], sizeof(nameDatei)-1);
        nameDatei[sizeof(nameDatei)-1] = '\0'; // 确保字符串以空字符结尾
    } else {
        printf("type in the name of the file: ");
        scanf("%99s", nameDatei); // 限制输入长度,避免缓冲区溢出
    }

    printf("%s\n", nameDatei);

    return 0;
}

补充说明

  • 用 argc > 1 判断是否有命令行参数比直接检查 argv[1] 更直观严谨。
  • 使用 strncpy 而非 strcpy 可以避免目标数组溢出,手动添加结束符 '\0' 确保字符串格式正确。
  • scanf("%99s", nameDatei) 限制输入长度为99,留一个位置给结束符,防止缓冲区溢出。

内容的提问来源于stack exchange,提问作者Enno Mühlbauer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:05:21