CS50 第 2 周凯撒

问题描述 投票:0回答:1

这只是我尝试运行的代码的初步部分,用于检查命令行参数的条件,该参数的输入是数字范围为 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: 
c cs50 caesar-cipher
1个回答
0
投票

您在检查

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
© www.soinside.com 2019 - 2024. All rights reserved.