cs50 Segfau 中的 Vigenere 密码
Vigenere cipher in cs50 Segfau
我没有经验coder.Please不要判断不好styling.I已经运行遇到了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 是大写还是小写,
正常编码 运行s。
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;
}
很可能,你的意思是
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)
--- 使用查找 table 以及各种有趣的指针数学和强制转换,因此它可能允许在没有编译器抱怨的情况下传递 char *
,但这绝对是不会产生好的结果。更改您的 if
语句,它应该会更好。
我没有经验coder.Please不要判断不好styling.I已经运行遇到了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 是大写还是小写, 正常编码 运行s。
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;
}
很可能,你的意思是
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)
--- 使用查找 table 以及各种有趣的指针数学和强制转换,因此它可能允许在没有编译器抱怨的情况下传递 char *
,但这绝对是不会产生好的结果。更改您的 if
语句,它应该会更好。