我已经解决了验证问题,但是现在我只得到了一个字符串作为密文,却找不到问题。这可能只是我所缺少的一点,但我们会提供任何帮助。顶部是我的终端窗口,底部是我的代码。
~/caesar/ $ make caesar
clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow caesar.c -lcrypt -lcs50 -lm -o caesar
~/caesar/ $ ./caesar 12
plaintext: "world, say hello!"
ciphertext: aaaaaaaaaaaaaaaaaaa
#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main(int argc, string argv[])
{
if(argc == 2)
{
int n = strlen(argv[1]);
int i = 0;
for(i = 0; i < n; i++)
{
if(!isdigit(argv[1][i]))
{
printf("Usage: ./caesar key\n");
return 1;
}
}
int key = atoi(argv[1]);
string text = get_string("plaintext: ");
printf("ciphertext: ");
int l = 0;
int t = strlen(text);
for(l = 0; l < t; l++)
{
if(isupper(text[i]))
{
printf("%c", (((text[i] - 'A') + key) % 26) + 'A');
}
else if(islower(text[i]))
{
printf("%c", (((text[i] - 'a') + key) % 26) + 'a');
}
else
{
printf("%c", text[i]);
}
}
}
else
{
printf("Usage: ./caesar key\n");
return 1;
}
printf("\n");
return 0;
}
您一直在测试文本[i]而不增加i,您应该测试文本[l]
int main(int argc, string argv[])
{
if(argc == 2)
{
int n = strlen(argv[1]);
int i = 0;
for(int l = 0; l < n; l++)
{
if(!isdigit(argv[1][l]))
{
printf("Usage: ./caesar key\n");
return 1;
}
}
int key = atoi(argv[1]);
string text = get_string("plaintext: ");
printf("ciphertext: ");
int t = strlen(text);
for(int l = 0; l < t; l++)
{
if(isupper(text[l]))
{
printf("%c", (((text[l] - 'A') + key) % 26) + 'A');
}
else if(islower(text[l]))
{
printf("%c", (((text[l] - 'a') + key) % 26) + 'a');
}
else
{
printf("%c", text[l]);
}
}
}
else
{
printf("Usage: ./caesar key\n");
return 1;
}
printf("\n");
return 0;
}
此代码更干净。