Шифр Vigenere в CS50 Segfau
Я не опытный кодер. Пожалуйста, не судите за плохой стиль. Я столкнулся с проблемой с шифром vingenere, который продолжает давать мне segfau
#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>**
int main(int argc,string argv[])
{
while (argc!=2)
{
printf("Incorrect input\n");
return 1;
}
printf("plaintext:");
string plaintext=get_string();
string num=argv[1];
int keylength=strlen(num);
for (int j=0, n=strlen(plaintext); j<n; j++)
{
char letter=plaintext[j];
if (isalpha(letter))
{
Это является причиной ошибки Segmantation Fault. Если я не проверяю, есть ли num в верхнем или нижнем регистре, код работает нормально.
if (isupper(letter)) { if (isupper(num)) { printf ("%c",((((letter-65)+(num[j%keylength]-65))%26)+65)); } else { printf ("%c",((((letter-65)+(num[j%keylength]-97))%26)+65)); } } else { if (isupper(num)) { printf ("%c",((((letter-97)+(num[j%keylength]-65))%26)+97)); } else { printf ("%c",((((letter-97)+(num[j%keylength]-97))%26)+97)); } } } else { printf ("%c",letter); }
}
printf("\n");
return 0;
}
1 ответ
Скорее всего, вы имели в виду
if (isupper(num[j % keylength))
Передача строки (на самом деле char *
) чтобы isupper()
является неопределенной операцией и может вызывать странные эффекты в зависимости от того, как isupper()
реализовано. Реализация GNU ---
#define __ctype_lookup(__c) ((__ctype_ptr__+sizeof(""[__c]))[(int)(__c)])
#define isupper(__c) ((__ctype_lookup(__c)&(_U|_L))==_U)
--- использует таблицу поиска со всеми видами забавных математических указателей и приведением под капотом, так что это, вероятно, позволяет char *
передается без жалоб компилятора, но это определенно не даст хороших результатов. Измени свой if
заявление, и оно должно работать лучше.