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
相关产品推荐
相关产品推荐

