这只是我尝试运行的代码的初步部分,用于检查命令行参数的条件,该参数的输入是数字范围为 0-9 的数字。如果为空,则强制用户输入。当命令行中存在非数字输入或命令行中存在多个输入时,程序成功打印错误消息。但是每当我在命令行中没有输入的情况下执行时,即使我在代码中添加了自己的错误消息(如果命令行中没有输入),它也会显示“分段错误(核心转储)”。我的问题是它不会显示我的错误消息
我尝试过的代码
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
bool only_int(string inputkey);
int check(string inputkey);
int main(int argc , string argv[])
{
bool check = only_int(argv[1]);
if(argc == 2)
{
if(check == true)
{
string plaintext = get_string("plaintext : ");
return 0;
}
else
{
printf("Usage: ./caesar key\n");
return 1;
}
}
else if((argc != 2) || (argv[1] == NULL))
{
printf("Usage: ./caesar key\n");
return 1;
}
}
//functions to check for only integral input
bool only_int(string inputkey)
{
int y = check(inputkey);
if(y > 0)
{
return true;
}
else
{
return false;
}
}
int check(string inputkey)
{
int result = 0;
for(int i = 0 , l = strlen(inputkey) ; i < l ; i++)
{
int x = isdigit(inputkey[i]);
if (x > 0)
{
result++;
}
}
return result;
}
我预计会是这样的
$ ./caesar
Usage: ./caesar key
$ ./caesar HELLO
Usage: ./caesar key
$ ./caesar 1 2 3
Usage: ./caesar key
$ ./caesar 13
plaintext:
但是我得到了什么
$ ./caesar HELLO
Usage: ./caesar key
$ ./caesar 1 2 3
Usage: ./caesar key
$ ./caesar
Segmentation fault (core dumped)
$ ./caesar 13
plaintext:
您在检查
argv[1]
的长度之前访问 argv
,这意味着您可能正在访问不属于您的内存。切换检查,你应该没问题:
int main(int argc , string argv[])
{
if (argc != 2)
{
printf("Usage: ./caesar key\n");
return 1;
}
// Now you know you have the right number of arguments,
// and can safely access argv[1] and check it