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

时间:2015-05-30 13:15:19

标签: 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]);

    if(k == NULL)
    {
        printf("YOU DID NOT INPUT ANYTHING AS COMMAND LINE ARGUMENT! ");
        return 1;
    }

    return 0;
}

3 个答案:

答案 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;
}