我正在尝试CS50的Pset2,在caesar.c
中,用户应该通过argv输入k;如果他不,我应该“大叫”
在用户告诉他使用命令行参数。但是,如果我尝试以下操作,我总是会遇到分段错误。
#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const string argv[])
{
unsigned int k = atoi(argv[1]);
if(k == NULL)
{
printf("YOU DID NOT INPUT ANYTHING AS COMMAND LINE ARGUMENT! ");
return 1;
}
return 0;
}
答案 0 :(得分:0)
当你这样做时
unsigned int k = atoi(argv[1]);
argv[1]
可能是NULL
。您应该在调用atoi
之前进行检查,因为将NULL
传递给atoi
会导致未定义的行为。改变
if(k == NULL)
{
printf("YOU DID NOT INPUT ANYTHING AS COMMAND LINE ARGUMENT! ");
return 1;
}
到
if(argv[1] == NULL)
{
printf("YOU DID NOT INPUT ANYTHING AS COMMAND LINE ARGUMENT! ");
return 1;
}
或
if(argc < 2)
{
printf("YOU DID NOT INPUT ANYTHING AS COMMAND LINE ARGUMENT! ");
return 1;
}
并在
之前移动它unsigned int k = atoi(argv[1]);
答案 1 :(得分:0)
在访问argc
之前,您应该检查argv
,因为没有参数,argv没有在argv[1]
初始化的任何内容,这会导致段错误,因为您正在访问未初始化的记忆。
答案 2 :(得分:0)
使用argc
检查计数。
检查以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char *argv[]) {
if( argc < 2) {
printf("YOU DID NOT INPUT ANYTHING AS COMMAND LINE ARGUMENT! \n");
return -1;
}
if(strcmp(argv[1],"k") == 0) { // yes, key is inputed,
// ...
printf("ok\n");
} else { // it's not k,
// ...
printf("Not ok.\n");
}
return 0;
}