使用sscanf读取用户命令输入后if判断语句应当检测什么条件
问题根因
- 你定义的
char line[5][20]是二维字符数组,每个line[i]都是长度为20的字符数组的首地址,属于固定地址值,永远不可能等于NULL,因此line[4] != NULL的判断逻辑完全无效。 sscanf不会对未匹配到的输出参数做任何修改或初始化操作,如果你没有提前清空line数组,未被赋值的位置会保留栈上的随机垃圾值,不会自动变成以\0开头的空串。sscanf的返回值就是成功读取并赋值的输入项数量,这是判断有效参数个数的最可靠依据。
修复方案
方案1:利用sscanf返回值判断(推荐)
直接读取sscanf的返回值,判断有效参数数量,适配任意输入的参数个数:
printf("Enter a command: "); char input[20]; char line[5][20]; fgets(input, 20, stdin); // 变量arg_cnt存储成功读取的参数个数 int arg_cnt = sscanf(input, "%s %s %s %s %s", line[0], line[1], line[2], line[3], line[4]); // ... 其他逻辑 ... else { int status; char *args[6]; // 按实际有效参数个数填充args数组 for(int i = 0; i < arg_cnt; i++) { args[i] = line[i]; } args[arg_cnt] = NULL; if (fork() == 0) { execv(args[0], args); } else { wait(&status); } }
如果你需要单独判断是否存在第N个参数(比如索引为4的第5个参数),直接判断arg_cnt > 4即可。
方案2:初始化数组后判断空串
如果不想用返回值,可以提前清空line数组,未被sscanf赋值的位置会保持空串状态,判断第一个字符是否为\0即可:
// 初始化line数组所有内容为0,注:使用memset需要引入头文件<string.h> memset(line, 0, sizeof(line)); sscanf(input, "%s %s %s %s %s", line[0], line[1], line[2], line[3], line[4]); // 判断line[4]是否有有效值的写法 if(line[4][0] != '\0') { // 对应逻辑 }
内容的提问来源于stack exchange,提问作者Kian Bianco
相关产品推荐
相关产品推荐

