snprintf编译报错:int赋值给char数组导致类型不兼容问题求助
C语言snprintf赋值错误的解决方法
错误原因
你遇到的编译错误核心在于:snprintf函数的返回值是int类型(表示成功写入的字符数,若超出缓冲区则返回需要的总字符数),而cmd是一个char[100]数组。在C语言中,数组名是指向数组首元素的常量指针,不能被赋值,所以cmd = snprintf(...)这种写法本质是把int值赋值给数组,类型不匹配,触发报错。
修正后的代码
去掉多余的赋值操作,直接调用snprintf填充cmd数组即可。另外注意fgets会读取输入末尾的换行符,需要手动去除,否则拼接后的ping命令会包含换行,导致执行异常:
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(){ char cmd[100]; char usr_in[50]; fgets(usr_in, sizeof(usr_in), stdin); // 去除fgets读取的换行符 usr_in[strcspn(usr_in, "\n")] = '\0'; // 直接调用snprintf,不需要赋值给cmd int ret = snprintf(cmd, sizeof(cmd), "ping %s", usr_in); // 可选:检查snprintf是否成功(缓冲区是否足够) if(ret >= sizeof(cmd)){ printf("命令过长,缓冲区不足\n"); return 1; } system(cmd); return 0; }
补充说明
strcspn(usr_in, "\n")会返回usr_in中第一个换行符的位置,将该位置设为'\0'即可截断换行符。- 检查
snprintf的返回值是良好的编程习惯,避免缓冲区溢出导致的未定义行为。
内容的提问来源于stack exchange,提问作者Joe Race
相关产品推荐
相关产品推荐

