我不是经验丰富的编码员。请不要判断造型不好。我遇到了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;
}
答案 0 :(得分: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)
---使用一个带有各种有趣的指针数学和转换的查找表,所以它可能允许在没有编译器抱怨的情况下传递char *
,但它肯定不会去产生好的结果。更改您的if
声明,它应该会更好。