凯撒密码输出空行
Caesar cipher outputs blank line
我正在做 CS50 课程中的问题集,我们必须实施凯撒密码。以下代码仅适用于数字(它们与预期的一样),当您输入字符时,没有任何输出。怎么了?
#include <cs50.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
//problem set requires arguments
int main (int argc, string argv [])
{
int i = 0;
if (argc != 2){
printf ("Retry\n");
return 1;
} else {
int x = atoi(argv [1]);
//gets plaintext
string a = get_string ("plaintext:");
printf("ciphertext:");
for (i = 0; i <= strlen(a); i++){
//if character is a number it remains unchanged
if (isdigit(a[i])){
printf ("%c", a[i]);
} else {
if (isupper(a[i])){
//converts from ASCII index to alphabetical index
char y = a[i] - 65;
//Caesar cipher formula. If upper case remains upper case.
y = toupper(a[i] + x % 26);
//goes back ASCII
printf("%c", y + 65);
} else if (islower(a[i])){
//converts from ASCII index to alphabetical index
char t = a[i] - 65;
//Caesar cipher formula. If lower case remains lower case.
t = tolower(a[i] + x % 26);
//goes back to ASCII
printf("%c", t + 65);
}
}
}
}
}
65
是字母 'A'
的 ASCII 值。如果您正在处理小写单词,则需要 97
,这是 'a'
的 ASCII 值
你已经计算了t
,但是你没有把结果带到下一行。此外,您必须对整条线取模。您期望 t
在 0
和 26
之间,然后将其添加到 97
char t = a[i] - 97;
t = (t + x) % 26;
printf("%c", t + 97);
for 循环也应该达到 strlen(a)
。字符串 a
中的最后一个索引是空字符,不应修改。您也可以在此处使用 'a'
而不是 97
。
for(i = 0; i < strlen(a); i++)
{
if(isupper(a[i]))
{
char y = a[i] - 'A';
y = (y + x ) % 26;
printf("%c", y + 'A');
}
else if(islower(a[i]))
{
char t = a[i] - 'a';
t = (t + x )% 26;
printf("%c", t + 'a');
}
else
{
printf("%c", a[i]);
}
}
我正在做 CS50 课程中的问题集,我们必须实施凯撒密码。以下代码仅适用于数字(它们与预期的一样),当您输入字符时,没有任何输出。怎么了?
#include <cs50.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
//problem set requires arguments
int main (int argc, string argv [])
{
int i = 0;
if (argc != 2){
printf ("Retry\n");
return 1;
} else {
int x = atoi(argv [1]);
//gets plaintext
string a = get_string ("plaintext:");
printf("ciphertext:");
for (i = 0; i <= strlen(a); i++){
//if character is a number it remains unchanged
if (isdigit(a[i])){
printf ("%c", a[i]);
} else {
if (isupper(a[i])){
//converts from ASCII index to alphabetical index
char y = a[i] - 65;
//Caesar cipher formula. If upper case remains upper case.
y = toupper(a[i] + x % 26);
//goes back ASCII
printf("%c", y + 65);
} else if (islower(a[i])){
//converts from ASCII index to alphabetical index
char t = a[i] - 65;
//Caesar cipher formula. If lower case remains lower case.
t = tolower(a[i] + x % 26);
//goes back to ASCII
printf("%c", t + 65);
}
}
}
}
}
65
是字母 'A'
的 ASCII 值。如果您正在处理小写单词,则需要 97
,这是 'a'
你已经计算了t
,但是你没有把结果带到下一行。此外,您必须对整条线取模。您期望 t
在 0
和 26
之间,然后将其添加到 97
char t = a[i] - 97;
t = (t + x) % 26;
printf("%c", t + 97);
for 循环也应该达到 strlen(a)
。字符串 a
中的最后一个索引是空字符,不应修改。您也可以在此处使用 'a'
而不是 97
。
for(i = 0; i < strlen(a); i++)
{
if(isupper(a[i]))
{
char y = a[i] - 'A';
y = (y + x ) % 26;
printf("%c", y + 'A');
}
else if(islower(a[i]))
{
char t = a[i] - 'a';
t = (t + x )% 26;
printf("%c", t + 'a');
}
else
{
printf("%c", a[i]);
}
}