“分段错误(核心已转储)”(argv 问题)- c

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

所以我尝试调试它,我知道它与 argv 有关,但我不确定what 发生了什么。

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

string replace();

int main(int argc, string argv[])
{
  if (strlen(argv[2]) != 26)
  {
    printf("The cipher must be 26 characters\n");
    return 0;
  }

明确地说,调试说问题发生在说

的那一行
if (strlen(argv[2]) !=26

给出的问题是“segmentation fault(core dumped)。只有在我执行程序后输入文本时才会出现这种情况。

所以后面的文字在这里:

  string plaintext = get_string("Plaintext: ");
  string word = plaintext;
  string result = replace(word);
}

string replace(string word, int argc, string argv[])
{
  string coded = NULL;
  for(int i = 0; i < strlen(word); i++)
  {
    int c = tolower(word[i]);
    int n = c - 97;
    if (n < 0 || n > 26)
    {
      n = c;
    }
    coded[i] = argv[2][n];
  }
  printf("coded: %s", coded);
  return 0;
}

我基本上想使用在命令行参数中输入的密码将明文字符串转换为代码。我知道我有一些错误(比如标点符号不会转换),因为我是新手,但我相信我可以自己解决这些问题。我只是想弄清楚为什么它会给我这个特定的错误。

c command-line segmentation-fault cs50 argv
1个回答
0
投票

在评论部分,你说你是这样调用你的程序的:

./substitution YTNSHKVEFXRBAUQZCLWDMIPGJO

这意味着

  • argc
    将具有值
    2
  • argv[0]
    将引用(“点”)字符串
    "./substitution"
  • argv[1]
    将引用(“点”)字符串
    "YTNSHKVEFXRBAUQZCLWDMIPGJO"
  • argv[2]
    将具有值
    NULL
    (即不会指向任何有效字符串)

因此,这条线

if (strlen(argv[2]) != 26)

未引用有效字符串,当您在该无效引用上使用

strlen
时可能会导致分段错误。

您可能打算使用

argv[1]
而不是
argv[2]
.

通常,在访问数组

argc
(“参数向量”)之前始终检查
argv
(“参数计数”)的值是个好主意。否则,如果用户只传递了一个命令行参数而你试图阅读
argv[1]
,你将使用无效的引用并且你可能会导致分段错误。

所以我建议你换台词

int main(int argc, string argv[])
{
  if (strlen(argv[2]) != 26)
  {
    printf("The cipher must be 26 characters\n");
    return 0;
  }

以下内容:

int main(int argc, string argv[])
{
    if ( argc < 2 )
    {
        printf( "You must specify at least one argument!\n" );
        exit( EXIT_FAILURE );
    }

    if ( strlen(argv[1]) != 26 )
    {
        printf( "The cipher must be 26 characters\n" );
        exit( EXIT_FAILURE );
    }

请注意,您必须

#include <stdlib.h>
才能使用功能
exit
。使用
exit
而不是
return
的优点是它可以用于在函数
main
之外立即终止您的程序。
return
语句只能在函数
main
内部使用时执行此操作,因此通常最好使用
exit
来保持一致性,即使在这种情况下使用
return
就足够了。否则,如果您出于某种原因决定将代码移动到另一个函数中,它将停止工作。

© www.soinside.com 2019 - 2024. All rights reserved.