编码Vigenère密码时c中的分段错误

时间:2016-06-21 20:42:41

标签: c compiler-errors segmentation-fault cs50 vigenere

我对编码很陌生,我一直在教自己如何使用EDX.org进行编码。本周我一直在研究密码学,我必须创建一个Vigenère的密码。我编写了代码,但大多数情况下,这是正确的。然而,当我编译程序时,它显示了分段错误。我一直在试图弄清楚为什么会这样,我完全陷入困境。你能看看我的代码并告诉我什么错了吗?

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


int index(int k, int c); 

int main (int argc, string argv[1])
{
    //check for correct criteria 
    if (argc = 2, isalpha(argv[1]))
    {
        string text = GetString(); 
        string key = argv[1]; //store key word
        int Totalshift = strlen(key); //number of shift for keyword


        int shift = 0; 

        //loops over the whole text
        for (int i = 0, n = strlen(text); i <n; i++ )
        {
            char p= text[i];
            char k = toupper(key[shift]); //Upper case for each character

           if (isupper(p))
            {
               //convert to 0 index
                 p = p - 65; 
                 k = k - 65; 

                int crypt= index (k , p); 

                printf("%c", crypt+65);

                shift= (shift+1) %Totalshift; 
            }
            else if (islower(p))
            {

                p = p - 97; 
                k = k - 65; 

                int crypt= index (k , p); 

                printf("%c", crypt+97);

                shift= (shift+1) %Totalshift; 
            }
            else 
            {
                printf("%c", p);
            }


        }
            printf("\n");
        }




    //error message
    else
    {
        printf("ERROR!\n");
        return 1; 
    }


}

//index function
int index(int k, int p)
{
   return (k+p)% 26; 

}

1 个答案:

答案 0 :(得分:1)

class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() NSNotificationCenter.defaultCenter().addObserver(self, selector: "stopAnim", name: "kStopAnimations", object: nil) } //...Your stopAnim method //... More Code } class SecondViewController : UIViewController{ override func viewDidLoad() { NSNotificationCenter.defaultCenter().postNotificationName("kStopAnimations", object: nil) } }

不。 永远不要隐藏指针。

string

然后:

int main(int argc, char ** argv)

在这里,你分配给变量(参数在这方面的行为就像局部变量)值//check for correct criteria if (argc = 2, isalpha(argv[1])) ,从而破坏了先前的值(它保存了给予的参数数量)程序)。结果是分配的值,因此2。然后,有comma operator:您放弃2,然后拨打2,这清楚地说明了应该始终打开警告的原因永远不要隐藏指针

isalpha(argv[1])的类型为argv[1],因此指针指向字符数组(或者,在本例中,我们知道以{{1}结尾的字符数组},称为 C字符串)。由于char * takes an int as parameter指针的值(&#34;内存地址&#34;)被隐式转换为(可能非常大)'\0'值。引用上面的链接,强调我的:

  

c参数是一个int,应用程序应确保的值可以表示为unsigned char或等于宏EOF的值。如果参数具有任何其他值,行为未定义

可能是分段错误的来源。

最后,isalpha对我来说真的很可疑。假设它分配了一些内存(对于可能从用户那里读取的字符串)...你在哪里免费那个内存?它是真的分配内存,还是可能返回一个指向具有自动存储持续时间的数组的指针(一个局部变量,可以这么说)?