繁体   English   中英

C-对字符串字符执行数学运算

[英]C- Performing mathematical operations on string characters

我对在C语言中的字符上执行数学运算感到困惑。这是为了实现基本密码。 我正在使用存储在命令行参数argv中的字符串。

for (int i = 0, n = strlen(p), m = strlen(argv[1]); i < n; i++)
{
    if ((p[i] >= 'A' && p[i] <= 'Z') || (p[i] >= 'a' && p[i] <= 'z'))
    {
        if (argv[1][i % m] >= 'A' && argv[1][i % m] <= 'Z')
        {
            printf("%c", ((p[i] - 'A') + ((argv[1][i % m]) - 'A')) % 26);
        }

        else if (argv[1][i % m] >= 'a' && argv[1][i % m] <= 'z')
        {
            printf("%c", ((p[i] - 'a') + ((argv[1][i % m]) - 'a')) % 26);
        }
    }

    else 
    {
        printf("%c", p[i]);
    }

我的困惑来自“ printf”行。 他们没有书面印刷,我也不知道为什么。 我进行了一些测试,发现如果将-'a'和%26删除到如下所示,我的代码可以正常打印:

printf("%c", p[i] + argv[1][i % m]);

但是,我不知道为什么会这样。 在我看来,我要尝试的工作应该与教授给出的示例没有什么不同:

string s = get_string();
if (s != NULL)
{
    for (int i = 0, n = strlen(s); i < n; i++)
    {
        if (s[i] >= 'a' && s[i] <= 'z')
    {
        printf("%c", s[i] - ('a' - 'A'));
    }
    else
    {
        printf("%c", s[i]);
    }
}

特别是,该行:

printf("%c", s[i] - ('a' - 'A'));

任何指导深表感谢!

您是正确的,可以简化代码。

在C语言中,像'a'这样'a'东西是int类型。 (与流行的看法相反,它们不是 char类型,只是C标准保证可以将它们分配给char类型而没有任何溢出危险。)使用单引号引起来的事实是C并不要求特定的字符编码 也就是说,您不必理会'a'等数字代表什么。 如果您确实在乎,那么严格来说您的代码不是可移植的C。

因此,是的,您的(a - b) - (c - b)形式的表达式简化为a - c

printf("%c", ((p[i] - 'a') + ((argv[1][i % m]) - 'a')) % 26);

从拔示巴被盗:

因此,是的,您的(a-b)-(c-b)形式的表达式简化为a-c。

好吧,(a-b)+(c-b)然后也得到a + c-2 * b ...

因此,您首先得到:

printf("%c", (p[i] + argv[1][i % m] - 2*'a') % 26);
//                                           ^  yet left...

下一点是%26-它会计算0到26之间的值-所有这些都是您大概不想看到的控制字符...

请注意,“ a”的数值为97,“ A”的数值为65(至少是ASCII码)。 因此,您将有兴趣将此值重新添加到结果中:

printf("%c", (p[i] + argv[1][i % m] - 2*'a') % 26 + 'a');
//                                                ^ (or 'A' in the upper case case)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM