显示分段错误(核心转储)维吉尼亚密码

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

我正在为 cs50 做 pset,无论我做什么,这都会显示分段错误。

我尝试了各种东西,但它一直显示相同的东西。

这是我正在尝试实现的 vigenere 密码的代码。

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

int main(int argc,string argv[]){

 if(argc == 2){

 //check if text
 if(isalpha(argv[1])){

 //key
 string num = argv[1];
 int num_length = strlen(num);

 //convert key to lower for easier stuff,dont want to repeat for higher too
 for(int i = 0;i < num_length;i++){

  if(isupper(num[i])){
    num[i]= tolower(num[i]);
  }

 }

 //ask for name
 printf("Line to be encoded please :- \n");
 string name = GetString(); 

 //main stuff
 for(int i=0,n = strlen(name);i < n;i++){

   if(isupper(name[i])){

   //key part
   int keyu = (num[i] - 97) % num_length;

   //converting to alphabetical index
   int alpha_name_upper = name[i] - 65;

   //encoding
   int encoded_upper = (alpha_name_upper + keyu) % 26;

   //converting back to ascii index
   name[i] = encoded_upper + 65;

   }

   if(islower(name[i])){

   int keyl = (num[i] - 97) % num_length;

   int alpha_name = name[i] - 97;
   int encoded_lower = (alpha_name + keyl) % 26;

   name[i] = encoded_lower + 97;

   }

  }

  printf("Encoded line :- %s \n",name);

 } 
 }else{

 return 1;

 }
}
c segmentation-fault
1个回答
1
投票

无论我做什么,这都会显示分段错误

不幸的是,您没有向我们展示

<cs50.h>
的内部结构,也没有向我们展示
string
是什么,也没有向我们展示
GetString()
的作用。

如果我们假设

string
char*
的 typedef(唯一有意义的),那么这一行:

if(isalpha(argv[1])){

不应编译,因为在

isalpha
上调用
char*
没有任何意义。

无论如何,你有一个核心转储时,你应该做的第一件事是使用调试信息(使用

-g
选项)构建程序并在调试器下运行它(例如
gdb
)。这会告诉您程序的哪一行崩溃了。

如果您运行在支持 valgrind 的平台(例如 Linux)上,您也应该在 valgrind 下运行程序,它通常可以准确地告诉您程序出了什么问题。

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