5

我有一个编程任务,我需要加密一个 4 位整数,由用户输入。我已将 int 拆分为四个单独的值,并且加密和解密功能起作用。我的问题是当我将四个单独的整数重新组合在一起时,一些数字加密为零(例如 in:1234 out:0189),我想将输出存储到一个 int 中以用于其他函数。

现在我有一个半生不熟的解决方案,如果第一个 int 为 0,则首先打印 0。

void joinInt(){
    if(int1 == 0) {cout << 0;}
    joined = int1 * 1000;
    joined += int2 * 100;
    joined += int3 * 10;
    joined += int4;
    cout << joined << endl;
    }

我的目标是返回joined(前导零),而不仅仅是在函数中打印它。

4

5 回答 5

5

做这个:

#include <iomanip>
#include <iostream>

std::cout << std::setfill('0') << std::setw(4) << joined << std::endl;
于 2012-10-17T20:04:34.337 回答
4

Anint包含一个数字。它不包含任何特定的表示信息,例如它是从包含一个前导零还是两个的文本中输入的,或者它是用十六进制、八进制还是鸡划痕编写的,或者即使它是通过添加一堆数字来计算的。它只是一个值。

如果要显示int带有前导零的 an,则必须以这种方式显式转换它:

char buf [20];
snprintf (buf, sizeof buf, "%04d", myint);  // output base 10, + leading zeros
                                           // for a field width of 4
于 2012-10-17T20:05:30.143 回答
3

这应该可以解决问题。

cout << setw(4) << setfill('0') << joined << endl;

为了使用这些操纵器,您需要:

#include <iomanip>
于 2012-10-17T20:03:49.660 回答
3

int 基本上存储前导零。您遇到的问题是您没有打印那里的前导零。

另一种不同的方法是创建一个函数,该函数将接受四个 int 值和一个字符串,然后返回一个带有数字的字符串。

使用这种方法,您将拥有一个具有非常好的凝聚力、无副作用、可在您需要完成类似操作的地方重复使用的辅助函数。

例如:

char *joinedIntString (char *pBuff, int int1, int int2, int int3, int int4)
{
    pBuff[0] = (int1 % 10) + '0';
    pBuff[1] = (int2 % 10) + '0';
    pBuff[2] = (int3 % 10) + '0';
    pBuff[3] = (int4 % 10) + '0';
    pBuff[4] = 0;                    // end of string needed.
    return pBuff;
}

然后在需要打印值的地方,您可以使用参数和提供的字符缓冲区调用函数,然后只打印字符缓冲区。

使用这种方法,如果你有一些不合理的数字最终有多个前导零,你将得到所有的零。

或者您可能想要一个将四个 int 组合成一个 int 的函数,然后是另一个将组合 int 与前导零打印的函数。

int createJoinedInt (int int1, int int2, int int3, int int4)
{
    return (int1 % 10) * 1000 + (int2 % 10) * 100 + (int 3 % 10) * 10 + (int4 % 10);
}

char *joinedIntString (char *pBuff, int joinedInt)
{
    pBuff[0] = ((joinedInt / 1000) % 10) + '0';
    pBuff[1] = ((joinedInt / 100) % 10) + '0';
    pBuff[2] = ((joinedInt / 10) % 10) + '0';
    pBuff[3] = (joinedInt % 10) + '0';
    pBuff[4] = 0;                    // end of string needed.
    return pBuff;
}
于 2012-10-17T20:32:42.997 回答
1

C++ 存储int为二进制数。但是所有 IO 都是字符串。因此,要显示 anint必须有从 anint到字符串的转换。在转换过程中,您可以从显示的数字中设置 with。使用流操纵器setwsetfill为此目的。

于 2012-10-17T20:05:28.890 回答