C语言将argv赋值给数组时报assignment to expression with array type错误如何解决
报错原因
- 类型不匹配:你定义的
networks是二维数组unsigned char networks[argc][4],networks[i]代表第i个长度为4的unsigned char数组,C语言中数组名是不可修改的左值,不能直接给整个数组赋值。你将atoi()返回的int值直接赋值给数组类型的networks[i],自然触发assignment to expression with array type报错。 - 逻辑错误:
argv[0]存储的是当前程序的调用路径,你要处理的是用户传入的参数,应该从下标i=1开始遍历;同时atoi()只能将整个字符串转为整数,无法拆分类似192.168.1.2这种带分隔符的IP地址为4个分段,不符合你注释中标注的「存储4字节网络地址」的需求。
解决方法
场景1:存储IPv4格式的网络地址
如果你需要把命令行传入的多个IPv4地址拆分为4个unsigned char分段存储,直接用sscanf格式化拆分字符串即可,修改后的代码如下:
#include <stdio.h> #include <stdlib.h> int main(int argc, char** argv){ if(argc == 1) { printf("ERROR ERROR, you messed up: 请传入至少一个IPv4地址参数\n"); return 1; } // 二维数组存储多组4字节网络地址,排除argv[0]所以长度是argc-1 unsigned char networks[argc-1][4]; // 从i=1开始遍历,处理用户传入的参数 for (int i = 1; i < argc; ++i){ int seg[4]; // 匹配四个用.分隔的整数 int parse_ret = sscanf(argv[i], "%d.%d.%d.%d", &seg[0], &seg[1], &seg[2], &seg[3]); if(parse_ret !=4){ printf("第%d个参数格式非法,不是合法IPv4地址\n", i); return 1; } // 转为unsigned char存入数组 for(int k=0;k<4;k++){ networks[i-1][k] = (unsigned char)seg[k]; } // 打印验证 printf("第%d个地址:%hhu.%hhu.%hhu.%hhu\n", i, networks[i-1][0], networks[i-1][1], networks[i-1][2], networks[i-1][3]); } return 0; }
场景2:仅存储单个整数值
如果你只是需要把每个命令行传入的整数字符串转为单个unsigned char存储,不需要4字节分段,直接把二维数组改为一维数组即可:
#include <stdio.h> #include <stdlib.h> int main(int argc, char** argv){ if(argc == 1) { printf("ERROR ERROR, you messed up"); return 1; } // 定义一维数组存储每个参数转换后的char值 unsigned char networks[argc]; for (int i = 1; i < argc; ++i){ networks[i] = (unsigned char)atoi(argv[i]); printf("\t%hhu\n", networks[i]); } return 0; }
内容的提问来源于stack exchange,提问作者Ivickt
相关产品推荐
相关产品推荐

