0

为什么我的代码不接受不包含字符 az AZ 0-9 的字符串?如果要对此进行加密以转移例如“aaaaa [[[[[[””,我会收到错误消息。我想要代码,以便它也可以接受空格或任何内容,并跳过那些不是 az、AZ、0-9 的代码。

为什么我的最后一个 else 语句不起作用?

例如:

"a       a" shift 1 

应该

"b       b"

我的代码:

#include <stdio.h>

int main (){

    char word[20];
    int rotx;

    printf("enter string\n");
    scanf("%s", word);

    printf("enter rotations\n");
    scanf("%d", &rotx);

    encrypt(word, rotx);

    return 0;
}

void encrypt (char word[], int rotx){

    int w = strlen(word) - 1;
    int i = 0;

    for ( ; i <= w; i++)
        if ((word[i] + rotx) >= 65 && (word[i] + rotx) <=90)
        {
                word[i] += (rotx);
        }
        else if ((word[i] + rotx) >= 97 && (word[i] + rotx) <=122)
        {
                   word[i] += (rotx);
        }
        else if ((word[i] + rotx) >= 48 && (word[i] +rotx) <= 57)
        {
                word[i] += (rotx);
        }
        else if ((word[i] + rotx) > 90 && (word[i]+rotx) <97)
        {
                word[i] = 64 + (rotx - (90-word[i]));
        }
        else if ((word[i] + rotx) > 122)
        {
                word[i] = 96 + (rotx - (122-word[i]));
        }
        else 
        {
        continue;
        }
}
4

3 回答 3

2

如果您使用scanf()获取字符串作为输入,它会接收字符串,忽略空格。所以如果你输入

hello world

只要

hello

被scanf作为输入。所以使用 fgets()

于 2013-04-02T01:58:55.940 回答
2

老实说,我不知道你在做什么。这是我认为凯撒密码基于我阅读的维基百科的代码。如果有人发现出于演示原因而有害的非句法缺陷,请告诉我。

PS,考虑阅读“ https://www.kernel.org/doc/Documentation/CodingStyle ”,它会帮助你(和我)很多。PS:如果我打破了上面的编码风格,它不会让我成为伪君子,我只是选择最适合我的风格。

花了5分钟写代码。

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

void encrypt(char *res, char *word, int rot)
{
    int len;
    int i;
    int tmp;

    len = strlen(word);

    for (i = 0; i < len; ++i) {
        tmp = word[i] - 'a';
        tmp += rot;
        tmp %= ('z' - 'a');
        res[i] = tmp + 'a';
    }

    res[len] = 0;
}

void decrypt(char *res, char *word, int rot)
{
    int len;
    int i;
    int tmp;

    len = strlen(word);

    for (i = 0; i < len; ++i) {
        tmp = word[i] - 'a';
        tmp -= rot;
        tmp %= ('z' - 'a');
        res[i] = tmp + 'a';
    }

    res[len] = 0;
}

int main()
{
    char word[20];
    char result[20];
    char decode[20];
    int rot;

    printf("enter a word: ");
    scanf("%s", word);

    printf("enter rotations: ");
    scanf("%d", &rot);

    encrypt(result, word, rot);    

    printf("result: %s\n", result);

    decrypt(decode, result, rot);

    printf("decode: %s\n", decode);

    return 0;
}
于 2013-04-02T02:23:04.487 回答
1

scanf()不会读取空格,因此将其更改为以下样式,

scanf("%[^\n]", word);

请不要使用gets()它,因为它已被弃用并且它的使用很危险,尤其是当您的目标是提供安全性时。

你也不需要这么复杂的encrypt()函数,下面给出的循环足以实现凯撒密码,

for ( ; i <= w; i++)
  {     
     word[i] +=rotx;
  }
于 2013-04-02T02:20:34.683 回答