我的 Vigenere 加密程序中的分段错误

Posted

技术标签:

【中文标题】我的 Vigenere 加密程序中的分段错误【英文标题】:Segmentation fault in my Vigenere encryption program 【发布时间】:2014-01-23 23:43:29 【问题描述】:

我是编程新手。这是到目前为止我编写的代码。忽略加密本身的细节;我知道这将需要更多的工作。当我尝试运行该程序时,我收到一条分段错误错误消息。如果argc != 2 我会收到消息,如果argc == 2 它会打印出“关键字”,但会显示相同的消息并且不会完成程序,所以我认为错误与引用 argv[1] 有关.

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

int main (int argc, string argv[])

   int i = 0, n = strlen(argv[1]);
   char KeyWord[i]; 

    //makes sure command line has 2 arguements
    if (2 != argc) 

        printf("argc != 2. Try again\n");
        return 1;


    //stores argv[1] as key
    for (i = 0; i < n; i++)
    
        KeyWord[i] = argv[1][i];  //malloc
        printf("%c", KeyWord[i]);
    
   printf("\n");

    if (isalpha(KeyWord))
        return 0;
    else
        
        printf("try again");
        return 1;
     

      int j, length;

     printf("input data: ");
     string message = GetString();

     for (i = 0; i < n; i++)   
       
        for (j = 0, length = strlen(message); j < length; j++)
        
            if (islower(message[j]))
            message[j] = message[j] -97 + KeyWord[i];

            if (isupper(message[j]))
            message[j] = message[j] -65 + KeyWord[i];
          
        if (i==n) i = 0;
        

【问题讨论】:

string argv[] 这是什么? &lt;cs50.h&gt; 提供typedef char *string; —— 这就是string argv[] 的含义。 【参考方案1】:

在确保argc == 2 之前,您不能在n 的初始化中计算strlen(argv[1])

另外,char KeyWord[i] 是错误的:因为i 是 0,所以你没有为任何东西分配空间。这至少应该在您编译它时产生一个警告,因为数组大小必须大于 0。如果您想要动态分配,您的评论建议,您应该在计算字符串长度后使用 malloc

代码应该是:

int i = 0, n;
char *KeyWord; 

// make sure command line has 2 arguments
if (2 != argc) 

    printf("argc != 2. Try again\n");
    return 1;

n = strlen(argv[1]);
KeyWord = malloc(n+1);
/* ... */

【讨论】:

以上是关于我的 Vigenere 加密程序中的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

Vigenere 未通过 check50 测试使用 C 中的“BaZ”错误将“BaRFoo”加密为“CaQGon”

cs50 的 Vigenere 密码程序错误

Vigenere 分段错误

CS50 PSet 2:Vigenere 密码分段错误

尝试加密/解密时出现 vigenere 密码错误

使用 vigenere 密码加密时出现奇怪的错误