我正在研究CS50上的问题集2,进行凯撒问题并遇到一些麻烦。
我尝试了下面的代码,但是它似乎只为单字符纯文本条目和世界产生随机字符,问好!
请原谅没有评论。
#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
//expects function to be declared later
bool validate(string key);
//Command line argument that launches with KEY
int main(int argc, string argv[])
{
//reject all input that is not a single string with the key
string key = argv[1];
if (argc != 2)
{
printf("Usage: ./caesar key");
return 1;
}
else if (validate(key)==true)
{
string plaintext = get_string("plaintext: ");
char ciphertext[strlen(plaintext)];
int intkey = atoi(key);
for(int i = 0; i < strlen(plaintext); i++)
{
if ((plaintext[i] >= 65 && plaintext[i] <=90) || (plaintext[i] >=97 && plaintext[i] <=122))
{
if ((plaintext[i]+(intkey % 26) > 122) || (plaintext[i]+(intkey % 26) >90 && plaintext[i]+(intkey % 26) < 97))
{
ciphertext[i] = plaintext [i] - (26 - intkey % 26);
}
else
{
ciphertext[i] = plaintext[i] + intkey % 26;
}
}
else
{
ciphertext[i] = plaintext[i];
}
}
printf("ciphertext: %s\n", ciphertext);
}
else
{
printf("Usage: ./caesar key");
}
}
bool validate(string key)
{
int count = 0;
for (int i = 0; i < strlen(key); i++)
{
if(isdigit(key[i]))
{
count++;
}
}
if (count == strlen(key))
{
return true;
}
else
{
return 1;
}
}
我正在研究CS50上的问题集2,进行凯撒问题并遇到一些麻烦。
我尝试了下面的代码,但是它似乎只为单字符纯文本条目和世界产生随机字符,问好!
请原谅没有评论。
答案 0 :(得分:1)
ciphertext[]
不会以空字符结尾,甚至没有空间,因此printf("ciphertext: %s\n", ciphertext)
可能在实际密文之后产生随机字符。可以通过在两次strlen(plaintext)
上加1来纠正此问题。