1

我正在尝试制作一个 C 程序,它通过按位置“旋转”每个字母来加密消息,根据需要从 Z 环绕到 A,但我得到了错误的结果。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
//Checks if the number of arguments are 2
   if (argc != 2)
   return 1;
   int k;
   int n = strlen(argv[1]);
 //Checks if the second arg(cipher) is a non negative number
   for (int i = 0; i < n ; i++ )
   {
       if (!(isdigit(argv[1][i])))
       {
           return 1;
       }
       k = atoi(argv[1]);
       if (k > 26)
       k = k%26;
       if (k < 0)
       return 1;
  }

unsigned int len_max = 128;
unsigned int current_size = 0;

char *pStr = malloc(len_max);
current_size = len_max;

if(pStr != NULL)
{
int c = EOF;
unsigned int i =0;
    //accept user input until hit enter or end of file
while (( c = getchar() ) != '\n' && c != EOF)
{   

    if (isalpha(c))
    {
        if(isupper(c))
        {
            if ((int)c + k > 90)
            c = (char)((int)c + k - 26);
            c = (char)((int)c + k);
        }
        else
        {
            if ((int)c + k > 122)
            c = (char)((int)c + k - 26);
            c = (char)((int)c + k);
        }
    }
    pStr[i++]=(char)c;

    //if i reached maximize size then realloc size
    if(i == current_size)
    {
        current_size = i+len_max;
        pStr = realloc(pStr, current_size);
    }
}

pStr[i] = '\0';

printf("%s\n",pStr);
    //free it 
free(pStr);
pStr = NULL;
return 0;
}
}

:) caesar.c 存在 :) caesar.c 编译 :) 使用 1 作为密钥将“a”加密为“b”

:( 将“barfoo”加密为“yxocll”,使用 23 作为密钥 \ 预期输出,而不是“yxz\n”

:) 使用 3 作为密钥将“BARFOO”加密为“EDUIRR” :) 使用 4 作为密钥将“BaRFoo”加密为“FeVJss”

:( 将“barfoo”加密为“onesbb”,使用 65 作为密钥 \ 预期输出,但不是“onrsoo\n”

:( 加密 "world, say hello!" 为 "iadxp, emk tqxxa!" 使用 12 作为密钥 \ 预期输出,而不是 "umpxp, qmw tqxxm!\n"

:( 处理缺少 argv[1] \ 预期输出,而不是退出代码 1

4

2 回答 2

1
if ((int)c + k > 90)
    c = (char)((int)c + k - 26);
c = (char)((int)c + k);

我已经修复了这里的缩进。想想这部分代码会做什么,以及可能缺少什么。

于 2016-02-23T19:35:32.953 回答
1

要将char字母 'A'..'Z' 和 'a'..'z' 转换为从 0 到 25 的数字k。将除以 26 的其余部分相加并计算:

int c;
while ( ( c = getchar() ) != '\n' && c != EOF )
{   
    if ( !isalpha( c ) )
        continue;

    char firstC = isupper( c ) ? 'A' : 'a';
    int num = (c - firstC + k ) % 26;
    pStr[i++] = (char)(num + firstC); 

    if ( i == current_size-1 ) // -1 because of '\0'
    {
        current_size += len_max;
        pStr = realloc( pStr, current_size );
    }
}
pStr[i] = '\0';
于 2016-02-23T19:50:09.937 回答