首页 > 解决方案 > 检查 argc 和 argv cs50 的功能

问题描述

尝试编写将检查 agrc == 2 的函数, argv[1] 不是负数,并且 argv[1] 中只有数字,否则主程序将无法运行,我们键入类似“错误!用法:./code key”因此,如果我们输入 ./code -1 或 ./code 123 gdf ​​或 ./code 123sdf 我们将面临错误消息并且主程序将无法工作,但如果我们输入 ./code 123 我们会更好,并且程序会进一步工作。

int validkey(int argc, string y)
{   

    int yl = strlen(y);

    if (argc == 2 && atoi(y) > 0) //atoi coverts string into int
    {
        for (int i = 0; i < yl; i++)
        {
            if (isdigit(y[i]))
                {
                printf("we good\n");
                return 0;
                }
            else
                {
                printf("Usage: ./code key\n");
                return 1;
                }
        }
    }
    else
    {
        printf("Usage: ./code key\n");
        return 1;
    }
return 0;
}

所以在主程序中我们有这样的东西 if (validkey(argc,argv[1]))并且主代码继续。但是这个函数根本不起作用,无论我们输入什么它都不会破坏主代码(返回 1;应该刹车吗?),如果我们输入 ./code 123ads 它将通过检查并返回 0;我做错了什么?

标签: ccs50

解决方案


好的,我了解出了什么问题,首先要更好地解决问题,bool其次int 重要的是了解如何循环工作。它的检查y[i],如果是true这样,如果y[0]数字循环不会继续检查y[1] y[2]等等,它会停止并且returns 0,所以如果我们输入 2d3d 循环将检查y[0]它的 2 所以它的数字所以我们很好并返回 0 而不是检查 y[1] .. . 等等,所以我的菜鸟解决方案是添加另一个 int veriable counter = 0for exaple 和

if(isdigit(y[i]))
{
    coounter++;
    if (counter == yl)
    {
        printf("we good\n");
        return 0;
    }
}

所以最终变体:

// check_the_key(argc, argv[1])
bool check_the_key(int argc, string argv)
{
    // atoi coverts string into int
    int key = atoi(argv);
    if (argc == 2 && key > 0)
    {
        int counter = 0;
        int lenv = strlen(argv);
        for (int i = 0; i < lenv; i++)
        {
            if (isdigit(argv[i]))
            {
                counter++;
            }
            if (lenv == counter)
            {
                printf("we good\n");
                return true;
            }

        }
    }
    printf("Usage: ./caesar key\n");
    return false;
}

推荐阅读