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

