加密过程工作一半
Encryption process working half
#include <stdio.h>
#include <string.h>
int main()
{
char inpusr[100];
int i, length,key;
length=100;
scanf("%[^\n]s",inpusr);
scanf("%d",&key);
printf("%s\n", inpusr);
for(i = 0; i <=length; i++) {
if(inpusr[i] >= 97 && inpusr[i] <=122) {
inpusr[i] = inpusr[i] + key;
if (inpusr[i]>122){
inpusr[i] = (inpusr[i] - 122)+96;
}
}
}
printf("%s\n", inpusr);
return 0;
}
我用 C 编写了一个程序来用凯撒密码方法加密一个字符串,但是当输入为 'z' 且密钥大于 6 时,为什么我的代码无法显示移位的字母表。
首先,请遵循一些有关如何操作字符数组的指南。
字符数组不是字符串。
char inpusr[100];
scanf("%[^\n]s",inpusr);
如果你在这里输入 "Hello" 你知道你在数组中得到了什么吗?
[H e l l o \0 \0 \0 \0 \0 %^j .....]
下次你可以使用
#include <string.h>
memset( inpusr , 0 , sizeof(inpusr));
现在关于你的代码,你说
if(a>10 && a<100)
{
if (a<5) // This is a logic error.If a<10 you don't get in to block.
{
}
}
出于对凯撒密码法的兴趣,是 A=(x+n) 模 26。
这是一个工作代码:
#include <stdio.h>
#include <string.h>
int main()
{
char inpusr[100];
int i, length,key;
length=100;
memset( inpusr , 0 , sizeof(inpusr));
scanf("%[^\n]s",inpusr);
scanf("%d",&key);
printf("%s\n", inpusr);
for(i = 0; i <=length; i++)
{
if(inpusr[i] >= 97 && inpusr[i] <=122)
{
inpusr[i] = (((inpusr[i] - 97 + key) % 26) + 97);
}
else if ((inpusr[i] >= 65 && inpusr[i] <=90))
{
inpusr[i] = (((inpusr[i] - 65 + key) % 26) + 65);
}
}
printf("%s\n", inpusr);
return 0;
}
基本问题是在计算每个字符的加密值时,可能会遇到大于127的值,这会导致计算溢出,导致负值inpuser[i]
.
例如,如果 inpusr[i]
是 122 ('z') 并且键是 6,那么 inpuser[i]
的新值将是 -128 而不是 128(这是需要的以便计算正确)。
解决此问题的一种方法是使用临时 int
变量重新实现编码字符的计算,这将消除溢出情况。
int main()
{
char inpusr[100];
int i, length,key;
length=100;
scanf("%[^\n]s",inpusr);
scanf("%d",&key);
printf("%s\n", inpusr);
for(i = 0; i <=length; i++) {
if(inpusr[i] >= 97 && inpusr[i] <=122) {
int encoded_char;
encoded_char = inpusr[i] + key;
if (encoded_char>122){
encoded_char = (encoded_char - 122)+96;
}
inpusr[i] = encoded_char;
}
}
printf("%s\n", inpusr);
return 0;
}
凯撒密码
#include <stdio.h>
#include <string.h>
int main()
{
char inpusr[100];
char key_input[3];
int key = 0;
int len = 100;
fgets(inpusr, len, stdin);
printf("%s\n", inpusr);
fgets(key_input, 3, stdin); // to allow -25
key = atoi(key_input);
printf("%d\n", key);
while (len--)
{
if (inpusr[len] >= 97 && inpusr[len] <=122)
inpusr[len] = (inpusr[len] - 97 + (key % 26) + 26) % 26 + 97; // '+ 26' is added in case of negative key
}
printf("%s\n", inpusr);
return 0;
}
避免使用 scanf,因为它不安全(您可以利用缓冲区溢出)。
而且你不考虑大写字母。
对不起,如果我忘记了什么。
#include <stdio.h>
#include <string.h>
int main()
{
char inpusr[100];
int i, length,key;
length=100;
scanf("%[^\n]s",inpusr);
scanf("%d",&key);
printf("%s\n", inpusr);
for(i = 0; i <=length; i++) {
if(inpusr[i] >= 97 && inpusr[i] <=122) {
inpusr[i] = inpusr[i] + key;
if (inpusr[i]>122){
inpusr[i] = (inpusr[i] - 122)+96;
}
}
}
printf("%s\n", inpusr);
return 0;
}
我用 C 编写了一个程序来用凯撒密码方法加密一个字符串,但是当输入为 'z' 且密钥大于 6 时,为什么我的代码无法显示移位的字母表。
首先,请遵循一些有关如何操作字符数组的指南。 字符数组不是字符串。
char inpusr[100];
scanf("%[^\n]s",inpusr);
如果你在这里输入 "Hello" 你知道你在数组中得到了什么吗? [H e l l o \0 \0 \0 \0 \0 %^j .....] 下次你可以使用
#include <string.h>
memset( inpusr , 0 , sizeof(inpusr));
现在关于你的代码,你说
if(a>10 && a<100)
{
if (a<5) // This is a logic error.If a<10 you don't get in to block.
{
}
}
出于对凯撒密码法的兴趣,是 A=(x+n) 模 26。
这是一个工作代码:
#include <stdio.h>
#include <string.h>
int main()
{
char inpusr[100];
int i, length,key;
length=100;
memset( inpusr , 0 , sizeof(inpusr));
scanf("%[^\n]s",inpusr);
scanf("%d",&key);
printf("%s\n", inpusr);
for(i = 0; i <=length; i++)
{
if(inpusr[i] >= 97 && inpusr[i] <=122)
{
inpusr[i] = (((inpusr[i] - 97 + key) % 26) + 97);
}
else if ((inpusr[i] >= 65 && inpusr[i] <=90))
{
inpusr[i] = (((inpusr[i] - 65 + key) % 26) + 65);
}
}
printf("%s\n", inpusr);
return 0;
}
基本问题是在计算每个字符的加密值时,可能会遇到大于127的值,这会导致计算溢出,导致负值inpuser[i]
.
例如,如果 inpusr[i]
是 122 ('z') 并且键是 6,那么 inpuser[i]
的新值将是 -128 而不是 128(这是需要的以便计算正确)。
解决此问题的一种方法是使用临时 int
变量重新实现编码字符的计算,这将消除溢出情况。
int main()
{
char inpusr[100];
int i, length,key;
length=100;
scanf("%[^\n]s",inpusr);
scanf("%d",&key);
printf("%s\n", inpusr);
for(i = 0; i <=length; i++) {
if(inpusr[i] >= 97 && inpusr[i] <=122) {
int encoded_char;
encoded_char = inpusr[i] + key;
if (encoded_char>122){
encoded_char = (encoded_char - 122)+96;
}
inpusr[i] = encoded_char;
}
}
printf("%s\n", inpusr);
return 0;
}
凯撒密码
#include <stdio.h>
#include <string.h>
int main()
{
char inpusr[100];
char key_input[3];
int key = 0;
int len = 100;
fgets(inpusr, len, stdin);
printf("%s\n", inpusr);
fgets(key_input, 3, stdin); // to allow -25
key = atoi(key_input);
printf("%d\n", key);
while (len--)
{
if (inpusr[len] >= 97 && inpusr[len] <=122)
inpusr[len] = (inpusr[len] - 97 + (key % 26) + 26) % 26 + 97; // '+ 26' is added in case of negative key
}
printf("%s\n", inpusr);
return 0;
}
避免使用 scanf,因为它不安全(您可以利用缓冲区溢出)。
而且你不考虑大写字母。
对不起,如果我忘记了什么。