C编程中的分段错误错误

时间:2020-05-13 21:07:22

标签: c cs50

当我只运行./caesar命令时,在此程序中出现 Segmentation Fault错误。我发现在代码开头写 int length = strlen(argv [1]); 时,错误被打印出来,当我将这行代码放在(for循环)之前时,它可以正常工作,但是我不明白为什么它在那里可以正常运行,而不是在程序顶部?

我非常感谢您的帮助!!提前致谢。

int main(int argc,string argv[])
{
    int s=0;
    int length=strlen(argv[1]); ##GETS ERROR

    if ( argc !=2)
    {
        printf("Usage:./caesar key\n");
        return 1;
    }
    else
    {

        int length=strlen(argv[1]); ##WORKS FINE

        for (int i = 0; i < length ; i += 1)
        {
            int c= argv[1][i];
            if (isdigit(c))
            {
                s += 1;
            }
            else
            {
                s+=0;
            }
        }
        printf("%i\n",s);
        if (length==s)
        {
            int key = atoi(argv[1]);
            printf("int:%i\n",key);
        }
        else
        {
            printf("Usage:./caesar key\n");
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您的第一次尝试:

int length=strlen(argv[1]); ##GETS ERROR

这会产生错误,因为调用main时只有一个参数:没有索引为1的参数。这种方式是不安全的,因此您应该先处理参数数量,然后解析/读取/使用争论。

第二次尝试时(在其中处理argc):


    if (argc !=2)
    {
        printf("Usage:./caesar key\n");
        return 1;
    }
    else
    {

    int length=strlen(argv[1]); ##WORKS FINE
    .....
    }

您已经确定有两个参数。因为,否则,您的代码将退出。问题是,您不会使用相同的测试用例来测试您的代码版本:您的代码和新代码(带有和不带有)都将使用两个参数。但是,如果只有一个参数,旧的将失败,而第二个则不会(仅从程序返回)。

答案 1 :(得分:0)

很可能需要在参数上使用凯撒。不仅要输入“ ./caesar”,还要输入“ caesar blah”。更重要的是,您应该编写一些代码来检查参数的数量。例如,您可能会写类似

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        fprintf(stderr, "Usage: %s arg1 arg2 ...\n", argv[0]);
        return EXIT_FAILURE;
    }

    /*
    ...
    Fill in code
    ...
    */
}

编辑:我觉得这里发生了一些误会。如果放置“ int s = strlen(argv [1]);”在片段“ if(argc!= 2)...”之前,凯撒程序将尝试在不存在的字符串上调用strlen,从而导致seg错误。本质上,总是在执行其他操作之前首先编写错误检查代码(“ if(argc!= 2)...”)。此外,在“ if(argc!= 2)...”之后不需要else。我觉得摆脱else关键字并将主体保留在else子句中是一种更好的样式。