我有这个程序读取字符串并将其分为三部分。第一部分是操作码,第二部分是数据,第三部分是密钥。
使用示例:
put this is stackoverflow
opcode: put
data: this is
key: stackoverflow
Code Main:
int main(int argc, char **argv){
char command[MAX_MSG];
fgets(command, sizeof(command), stdin);
char *data;char *key;
command[strcspn (command, "\n")] = '\0';
char *aux_command_key = strdup(command);
char *aux_command_data = strdup(aux_command_key);
char *opcode = strtok(command, " ");
int success = 0;
if(strcmp(opcode, "put") == 0){
key = strdup(getKey(aux_command_key, opcode));
if(key == NULL){
printf("Invalid number of arguments.\n");
return -1;
}
else
data = getData(aux_command_data, opcode, key);
}
printf("opcode: %s\n",opcode);
printf("data: %s\n",data);
printf("key: %s\n",key);
free(aux_command_key);
free(aux_command_data);
}
我的问题是当我在没有按键的情况下运行我的程序时,它会给我分段错误,而不是: “无效的参数数量”。 我不知道为什么会这样。感谢。
答案 0 :(得分:0)
如果你在没有提供密钥的情况下运行该程序,那么getKey(aux_command_key, opcode)
将返回NULL
。
strdup()
具有未定义的行为。 (换句话说,不要将空指针传递给strdup()
)。
POSIX标准一般说明了关于库函数的以下内容(C标准有类似的语言,但strdup()
是POSIX的一部分,而不是C标准):
2.1.1功能的使用和实施
以下各项陈述均适用于所有功能,除非 在以下详细说明中明确说明:
- 如果函数的参数具有无效值(例如值) 在函数域之外,或者在地址之外的指针 程序空间或空指针),行为未定义。
醇>...
假设参数必须有效,除非文档明确声明处理某些无效值是一个很好的经验法则,几乎可以遵循任何API。请参阅:"Basic ground rules for programming - function parameters and how they are used"
答案 1 :(得分:0)
您正在使用getKey
指令调用put
,并且您说您在输入中没有提供足够数量的参数。因此,我认为getKey
将返回NULL
。您无法使用strdup
致电NULL
。
我的建议:首先,致电getKey
,然后,如果它没有返回NULL
,您可以复制它:
if(strcmp(opcode, "put") == 0){
key = getKey(aux_command_key, opcode);
if(key == NULL){
printf("Invalid number of arguments.\n");
return -1;
}
else {
key = strdup(key);
data = getData(aux_command_data, opcode, key);
}
}