首页 > 解决方案 > C编程中的分段错误错误

问题描述

当我刚刚运行 ./caesar 命令时,我在这个程序中遇到了分段错误错误。我发现当我写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");
        }
    }
}

标签: ccs50

解决方案


您的第一次尝试:

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
    .....
    }

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


推荐阅读