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