此代码应根据命令参数输入键加密文本并打印出加密文本。但它不会打印空格和标点符号。有人可以解释什么是错的吗?
使用示例:
$ ./caesar 12
world, say hello!
iadxp, emk tqxxa!
$
代码:
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
if (argc>2 || argc<2)
{
printf("Please enter a valid argument.\n");
return 1;
}
string input = GetString();
int key = atoi(argv[1]);
for(int i = 0, l = strlen(input); i < l; i++)
{
//if(isalpha(input[i]))
//{
char c = input[i];
int letternum = c;
if(isupper(c))
{
int upper = 'A';
int alphanum = letternum - upper;
int newint = (alphanum + key) % 26;
newint = newint + upper;
char newchar = newint;
printf("%c", newchar);
}
if(islower(c))
{
int lower = 'a';
int alphanum = letternum - lower;
int newint = (alphanum + key) % 26;
newint = newint + lower;
char newchar = newint;
printf("%c", newchar);
}
//}
}
printf("\n");
}
答案 0 :(得分:1)
在else
阻止后添加if()
。
从
改变 if(isupper(c)) {
...
}
if(islower(c)) {
...
}
到
if(isupper(c)) {
...
} else if(islower(c)) {
...
} else {
putc(c);
}
注意:由于is...()
函数是为int
和unsigned char
范围内的所有EOF
值定义的,因此迂腐代码将使用以下内容。
isupper((unsigned char) c)
islower((unsigned char) c)
注2:如果alphanum + key < 0
,代码会出现问题。可能想要添加一项测试以确保key
不会过于消极或使用以下内容来确保key >= 0
。
int key = atoi(argv[1]) % 26 + 26;
注3:OP的代码假定A-Z
和a-z
是连续的,就像在ASCII编码中一样(当然是99.99 +%的情况。)但不在{{3}中}