2014-01-23 25 views
-1

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

#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; 
     } 
} 
+0

'字符串的argv []'这是什么? –

+0

''提供'typedef char * string;' - 这就是'string argv []'的意思。 –

回答

0

不能确保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); 
/* ... */