程序不打印空格和节制

时间:2016-03-17 18:04:45

标签: c caesar-cipher cs50

此代码应根据命令参数输入键加密文本并打印出加密文本。但它不会打印空格和标点符号。有人可以解释什么是错的吗?

使用示例:

$ ./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");
}

1 个答案:

答案 0 :(得分:1)

else阻止后添加if()

改变
       if(isupper(c)) {
         ...
       }
       if(islower(c)) {
         ...
       }

       if(isupper(c)) {
         ...
       } else if(islower(c)) {
         ...
       } else {
         putc(c);
       }

注意:由于is...()函数是为intunsigned 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-Za-z是连续的,就像在ASCII编码中一样(当然是99.99 +%的情况。)但不在{{3}中}