如何解决c中的分段错误?

How to solve segmentation fault in c?

当我制作我的程序时,我得到了一个名为 Segmentation Fault 的错误类型。

#include <cs50.h>
#include <string.h>
#include <stdio.h>

int main(int argc, string argv[])
{
    char i = strlen(argv[2]);
    if (argc == 2)
    {
        printf("%i %s %hhd", argc, argv[2], i);
    }
}

我运行这个程序使用这些命令

make substitution

然后

./substitution abcdefghijklmnopqrstuvwxyz

在此我们必须添加一个 26 字的密钥,在上面的行中是 a 到 z。

知道的请帮忙解决

您遇到了段错误,因为指定的所需参数的数量做得不好。主要问题在这里:

if (argc == 2)

用户传递的实际个参数的数量等于所需参数的数量减去11。应该是:

int main(int argc, char *argv[]) {
  if (argc != 3) {
    // Number of arguments are either greater or lesser than 3
    // Handle the error
  }

  // Ok...
}

您现在可以安全地使用参数了。


1.程序的调用命令,例如./a.out也算作参数(argv[0])。

如果您调用您的程序:

./substitution abcdefghijklmnopqrstuvwxyz

argc 将是 2,而 argv 将是一个包含 3 个指针的数组:

argv[0]指向字符串./substitutionargv[1]指向字符串abcdefghijklmnopqrstuvwxyzargv[2]为NULL。如果您试图通过调用 strlen(argv[2]) 来计算 NULL 的长度,那将是一个错误。您不得将 NULL 传递给 strlen。我认为您的错误只是错误地索引了 argv 数组。 C 中的数组是从零开始的。如果你想计算第一个参数的长度,你想使用 argv[1],而不是 argv[2]:

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

int
main(int argc, char *argv[])
{
    int rc = EXIT_FAILURE;
    if( argc > 1 ){
        size_t i = strlen(argv[1]);
        printf("%i %s %zd\n", argc, argv[1], i);
        rc = EXIT_SUCCESS;
    }
    return rc;
}