为什么我总是在这个CS50 Pset中出现分段错误?

为什么我总是在这个CS50 Pset中出现分段错误?,c,cs50,C,Cs50,我目前正在尝试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])

我目前正在尝试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;
}
#包括
#包括
#包括
int main(int argc,常量字符串argv[])
{
无符号整数k=atoi(argv[1]);
if(k==NULL)
{
printf(“您没有输入任何命令行参数!”);
返回1;
}
返回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;
}


在访问
argv
之前,您应该检查
argc
,因为没有参数,argv在
argv[1]
处没有任何初始化,这会导致segfault,因为您正在访问未初始化的内存。

使用
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;
}
#包括
#包括
#包括
int main(int argc,const char*argv[]{
如果(argc<2){
printf(“您没有输入任何命令行参数!\n”);
返回-1;
}
如果(strcmp(argv[1],“k”)==0{//yes,则输入密钥,
// ...
printf(“ok\n”);
}否则{//它不是k,
// ...
printf(“不正常。\n”);
}
返回0;
}
if(argc < 2)
{
    printf("YOU DID NOT INPUT ANYTHING AS COMMAND LINE ARGUMENT! ");
    return 1;
}
unsigned int k = atoi(argv[1]);
#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;
}