C密码出错
C cipher go wrong
我正在尝试制作一个 C 程序,它通过 "rotating" 每个字母按位置加密消息,根据需要从 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] = '[=10=]';
printf("%s\n",pStr);
//free it
free(pStr);
pStr = NULL;
return 0;
}
}
:) caesar.c 存在
:) caesar.c 编译
:) 使用 1 作为密钥
将 "a" 加密为 "b"
:( 使用 23 作为密钥将 "barfoo" 加密为 "yxocll"
\ 预期输出,但不是 "yxz\n"
:) 使用 3 作为密钥将 "BARFOO" 加密为 "EDUIRR"
:) 使用 4 作为密钥
将 "BaRFoo" 加密为 "FeVJss"
:( 使用 65 作为密钥将 "barfoo" 加密为 "onesbb"
\ 预期输出,但不是 "onrsoo\n"
:( 使用 12 作为密钥将 "world, say hello!" 加密为 "iadxp, emk tqxxa!"
\ 预期输出,但不是 "umpxp, qmw tqxxm!\n"
:( 处理缺少 argv[1]
\ 预期输出,而不是 1
的退出代码
if ((int)c + k > 90)
c = (char)((int)c + k - 26);
c = (char)((int)c + k);
我已经修复了这里的缩进。想想这段代码会做什么,可能会遗漏什么。
要移动单个 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 '[=10=]'
{
current_size += len_max;
pStr = realloc( pStr, current_size );
}
}
pStr[i] = '[=10=]';
我正在尝试制作一个 C 程序,它通过 "rotating" 每个字母按位置加密消息,根据需要从 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] = '[=10=]';
printf("%s\n",pStr);
//free it
free(pStr);
pStr = NULL;
return 0;
}
}
:) caesar.c 存在 :) caesar.c 编译 :) 使用 1 作为密钥
将 "a" 加密为 "b":( 使用 23 作为密钥将 "barfoo" 加密为 "yxocll" \ 预期输出,但不是 "yxz\n"
:) 使用 3 作为密钥将 "BARFOO" 加密为 "EDUIRR" :) 使用 4 作为密钥
将 "BaRFoo" 加密为 "FeVJss":( 使用 65 作为密钥将 "barfoo" 加密为 "onesbb" \ 预期输出,但不是 "onrsoo\n"
:( 使用 12 作为密钥将 "world, say hello!" 加密为 "iadxp, emk tqxxa!" \ 预期输出,但不是 "umpxp, qmw tqxxm!\n"
:( 处理缺少 argv[1] \ 预期输出,而不是 1
的退出代码if ((int)c + k > 90)
c = (char)((int)c + k - 26);
c = (char)((int)c + k);
我已经修复了这里的缩进。想想这段代码会做什么,可能会遗漏什么。
要移动单个 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 '[=10=]'
{
current_size += len_max;
pStr = realloc( pStr, current_size );
}
}
pStr[i] = '[=10=]';