【问题标题】:C segmentation fault Pset2 Cs50C 分段错误 Pset2 Cs50
【发布时间】:2022-01-24 03:13:42
【问题描述】:

我在 CS50 上执行 Pset2 cesear 并且在运行程序时不断遇到分段错误。为什么我得到它,什么是分段错误。 ..................................................

#include <ctype.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(int argc, string argv[])
{
    string key = argv[argc-1];

    int keylen = strlen(key);

    string plaintext = get_string("Enter the plaintext: ");

    int ciphertext [strlen(plaintext)];

    int move[strlen(key)];

    int counter = 0;


    for (counter = 0; counter < 26; counter++)
    {
        if ((plaintext[counter] > 96) && (plaintext[counter] < 123))
        {
            move[counter] = (plaintext[counter]) - 97 ;
            ciphertext[counter] =key[move[counter]];
        }

        else if (plaintext[counter] > 64 && plaintext[counter] < 91)
        {
            move[counter] = plaintext[counter] - 65;
            ciphertext[counter] =key[move[counter]];
        }

        else ciphertext[counter] = plaintext[counter];
    }
 for (int loop = 0; loop < strlen(plaintext); loop++)
 {
 printf("%c\n", ciphertext[loop]);
 }
}

【问题讨论】:

  • 您缺少包含。
  • 所以一个问题,您显然是在要求用户为他们的输入字符串输入 准确 26 个字符?对此很有信心,是吗?如果我只是输入文本“否”怎么办?你认为从 0..25 开始的循环会针对 plaintext[counter] 做什么?硬编码的 26 是从哪里来的(为什么)?
  • get_string() 是做什么的?没有stackoverflow.com/help/mcve,你不可能得到有用的答案
  • 而不是if( plaintext[counter] &gt; 64 ),写成if( plaintext[counter] &gt;= 'A')更具可读性。对于所有其他硬编码值也是如此。总是写'A'而不是65'a'而不是97等等。
  • 你为什么要迭代 for (counter = 0; counter &lt; 26; counter++) 而不是从 0 到 strlen(plaintext)?

标签: c error-handling cs50


【解决方案1】:

什么是分段错误。

分段错误意味着:您试图访问您的程序无法访问的内存。

我为什么会得到它

因为你的程序有错误。

没有http://stackoverflow.com/help/mcve,就很难告诉哪里这个错误在哪里。可能在get_string() 例程中。

附:永远不要永远将指针隐藏在 typedef 后面(就像您显然对 string 所做的那样)——这只会让您和您代码的其他读者感到困惑。

【讨论】:

    【解决方案2】:

    如果strlen(plaintext)小于26,那么

    for (counter = 0; counter < 26; counter++){
            if ((plaintext[counter] ...
    

    很可能会在counter &gt;= strlen(plaintext) 时立即导致段错误,因为您正在尝试访问超出其边界的plaintext 数组。您可能打算遍历字符串而不是字母表。

    【讨论】:

    • “很可能会导致段错误”——(假设get_string() 从堆中分配内存)不太可能根本。未定义的行为,是的。分段错误,没有。
    • @EmployedRussian 未定义行为的一个可能后果是分段错误。在这种特殊情况下,分段错误是 U.B. 的可能后果
    猜你喜欢
    • 2020-11-26
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多