编码维吉涅尔密码时 C 中的分段错误



我真的是编码的新手,我一直在教自己如何使用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; 
}

string

no。 永远不要隐藏指针。

int main(int argc, char ** argv)

然后:

//check for correct criteria 
if (argc = 2, isalpha(argv[1]))

在这里,您分配到变量(参数在这方面的局部变量的行为)值2,从而破坏了先前的值(该值保留了对程序给出的参数数量)。结果是分配的值,因此2。然后,有一个逗号操作员:您丢弃该 2,然后致电isalpha(argv[1]),这清楚地说明了您>为什么应始终打开警告 and >从不,永远不要隐藏pointers :p> argv[1]是类型char *,因此a Pointer to to to to carture Array(或者,如我们所知,在这种情况下是用''终止的字符阵列,称为A c String c String )。由于isalphaint作为参数,因此将指针("内存地址")的值隐式转换为(可能很大)int值。从上面的链接引用,重点是我的:

c参数是一个int,应用程序应确保可表示为无符号字符或等于宏观eof的值的值。如果参数具有其他值,行为是未定义的

可能是分割故障的来源。

最后,GetString对我来说真的很富有。假设它分配了一些内存(大概是从用户读取的字符串)...您 free 该内存在哪里?是真的分配内存,还是将指针返回具有自动存储持续时间的数组(可以说是本地变量)?

相关内容

  • 没有找到相关文章

最新更新