【问题标题】:When trying to create a cipher, how do you go about changing the characters in a string to integers尝试创建密码时,如何将字符串中的字符更改为整数
【发布时间】:2020-08-25 16:01:39
【问题描述】:

我想问的是,当您编写密码并要求用户输入时。您将如何将字符串中的字符更改为数字,以便您可以将它们插入公式,然后再输出另一个字母。

    string s = get_string("Plain Text:");

    while (s[a] != '\0')
    {
        if (isalpha(s[a]))
        {
            for (c = 0, e = strlen(s); c < e; c++)
            {
                if (isupper(s[a]))
                {
                    printf("C\n");
                    a++;
                }
                if (islower(s[a])) // (x=(?+(argv[1][i]))%26) This is the formula, the ? is where im trying to figure out how to change characters into numbers and then back in characters
                {
                    printf("c\n");
                    a++;
                }
            }
        }                    
    }

'printf' 是为了确保代码正确地检查小写或大写。如果我没记错的话,我需要 2 个具有不同范围的公式,以便一个更高,另一个更低,这样我就可以将它们都插入一个密码公式中。我很确定你也可以不检查它的上限或下限,但我真的不明白你将如何创建范围或循环,以便它始终保持在字母字符中,无论它是大写还是小写。

【问题讨论】:

  • C中字符串中的字符整数(它们的确切类型是char,它是一个整数)。
  • 关于CS50 Caesar Cipher的问题有数百个,你可以在那里看到公式。示例:stackoverflow.com/questions/63568354/…
  • 第1步:(s[a] - 'A') 'A'的偏移量。

标签: c cs50


【解决方案1】:

char 类型是一个 8 位整数。所以字符串是一个 8 位整数的数组。

因为您提到了将c % 26 应用于字符值的公式,所以我假设您只对本练习中的 ASCII 文本感兴趣。如果您关心非 ASCII 编码,则需要更改整个方法。通常,您不能对字符串进行逐字节分析。例如,在 UTF8 中,一些字形将跨越一个字节以上,而在 UTF16 中,每个字形至少是两个字节。

大写 A-Z 字符在 65..90 范围内,小写 a-z 字符在 97..122 范围内。因此,在对它们应用算术公式之前,您需要在 0..25 范围内获取这些值。

你可以这样做:

  • isupper(s[a]) 为真时:int c = s[a] - 65;
  • islower(s[a]) 为真时:int c = s[a] - 97;

然后应用你的公式。

顺便说一句,通常在使用 chars 进行算术运算时,您需要特别注意 128 到 255 之间的值,因为 char * 不是指向 unsigned 数组的指针强>价值观。对于 Unicode 字符串,您的某些字形可能每个跨越一个以上的字节。但是因为我们只考虑 ASCII 字符串,所以这里不适用。

【讨论】:

  • 大写的 A–Z 字符在 65..90 范围内... 这仅适用于 ASCII 字符集。一般情况下并非如此。
  • 绝对正确。由于@Frank 的问题涉及一个将c % 26 应用于每个字符值的公式,因此我假设一个ASCII 约束,但你是对的,值得明确指出。我会将这个假设添加到答案中。
  • 我假设您会将减去的数字加回公式中还是不需要?
  • 是的,假设您希望编码的字符是字母的,您希望在完成密码后重新添加偏移量。 (另一方面,您可能想使用数字,或在大小写之间切换,或使用非字母数字符号,或其他。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多