2012-10-17 32 views
3

我有一个编程任务,我需要加密一个4位int,用户输入。我已经将int分成四个单独的值,并且加密和解密函数可以工作。我的问题是,当我把四个单独的整数放在一起,一些数字加密为零(例如:1234 out:0189),并且我想将输出存储到一个int以供其他函数使用。是否可以将前导零存储在int中?

现在我有一个打印0第一个半生不熟的解决方案,如果第一个int是0

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

我的目标是回到加入(与领先的零),而不仅仅是内部的打印功能。

+1

'setw'可能派上用场。 – chris

+2

并且'setfill'也是。 – MPelletier

+0

那些进入int? –

回答

2

的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; 
} 
+0

再次感谢您的回答,我觉得您是唯一一个阅读并真正理解我的问题的人。 –

3

这应该可以做到。

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

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

#include <iomanip> 
4

这样做:

#include <iomanip> 
#include <iostream> 

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

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

3

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

如果你想显示带前导零的int,那么你必须明确地转换这种方式:

char buf [20]; 
snprintf (buf, sizeof buf, "%04d", myint); // output base 10, + leading zeros 
              // for a field width of 4 
+0

+1用于解释关于前导零与int如何表示无关的问题。 – bames53

+0

这取决于。如果有一个应用程序严重依赖于显示整数,并且始终需要它们为固定宽度,并且事实上显示操作比实际整数算法重要得多(尽管这也需要支持,所以它们不能仅仅是字符串),实际使数据类型具有固定宽度可能很重要。例如,我可以看到这对一些原始的小电子设备来说很重要。我们都习惯于int类型的常见用例,它显示的是(正确)与类型的规范高度分离的。但这不是一个普遍的道理...... – ely

+0

我想我说有时候有人要求数据类型'int'具有数学整数不需要的额外的,特定于应用程序的属性是合理的。对于通用计算来说,这是非常不可取的,但是在那里它可能存在领域特定的问题。所以我很犹豫是否赞同“一个int包含一个数字”的想法。是的,*数学*整数包含数字的表示形式。但是'int'实例应该包含你的系统中需要的任何东西。通常这是一个尽可能忠实于数学整数的解耦对象。但不总是。 – ely

相关问题