当前位置:C++技术网 > 资讯 > 简单的基础关于数据的编程问题

简单的基础关于数据的编程问题

更新时间:2017-03-26 11:46:06浏览次数:1+次

有个很简单的问题,但是脑子转不过来,不适用字符串和数组,判断输入的一个整数长度及正负,如果遇到像000001这样的怎么做?不用字符和数组的话读入的不就是1了?还是我理解有问题,求指点一下

C++技术网会员解答:

    你好,感谢你对C++技术网的支持。没有简单的问题,只有简单的解答!如果有这些问题,请尽管提出来。

    你需要实现的效果是判断一个整数的长度和正负。然而,在遇见00001这样的数字时发现不知道怎么处理了。你的问题不在于整数使用,而是在于如何处理整数格式以及整数的表示形式上面。下面我给你做一个详细的解答,方便里理解。

    整数和字符是两种数据类型。不能使用字符或者字符串表示数字,因为整数就是整数,字符就是字符。字符串也就是字符数组,只不过字符数组最后一个字符是\0而已。

    所以,对于数字的判断和处理,请使用数字模式,而不要想着字符串等模式。两者压根就不是一回事。对于整数的处理,其实就和数学的整数差不多的处理。为什么不是说和数学一样的呢?因为计算机实现的整数,总是有限的范围。对于数学上的整数和计算机中的整数的差别理解,请阅读《C++语言零基础入门教程:4.2 整型数据类型:数学整数定义到计算机整数定义之旅》。

    那么整数长度的说法就不对了。对于一个整数来说,只有大小,没有说长度的。最多也是整数的数值范围。你能说123这个数字的长度是3个字符吗?这是不准确的。你说的这个长度是3个字符,那是把数字当成了字符串了。在计算机中,1和123如果都用int表示,他们占用的位数都是8位。而对于整数的正负的比较,只要与0比较就行了。

    如果是整数数据类型,以上就可以了。但是你的问题其实并不是上面那么简单,以至于你都晕乎了。下面来说说怎么回事。

    其实你说的整数并不是整数数据类型,而是字符串,只不过这个字符串字面上是数字字符组成的,比如"123",和数字123是不一样的。所以才有你说的整数的长度和正负的判断。因为你这个是判断字符串了,所以才迷糊了。然后才发现000001理解更是有问题了,发现读成数字的话,就没有这么多个0了。其实问题还是字符串和数字的问题。

    你要读取的是字面是数字的字符数组或者叫做字符串。然后你要判断这个字符串里的数字字面值的正负,还要判断数字字面值的字符串的长度。然后要原样将000001的字符串读入,而且要保持长度不变。

    总结一下,你说来说去就是要对字符数组或字符串的处理,而你误以为这是数字处理,所以才迷糊了。

    所以,要判断字符串,可以用strlen等函数,如果要判断这个字符串的数字的正负,你可以直接判断第一个字符是否为''''-''''负号字符。当然你还可以将这个数字字符串转换为真正的数字,比如atoi,atol,atof。这样就成为了真正的数字了,也可以直接通过数字0来判断正负。

    但是问题来了,如果用数字的方式,你的000001数字字符串就丢失了前面的0。你想让前面的0保留。前面的0有专业的叫法,叫做前导0,占位用的。一般对一批数字的处理,你会事先知道数字字符串的字符个数,如果不足则用0填充前面,这样格式上看上去很整齐。所以,你如果要对数字进行数学运算,那就要转换为数字类型,处理完后,再使用前导0格式化为字符串就行了。下面是示例代码:

char num[10]="000001";
int i = atoi(num);
i++;
sprintf(num,"%06d",i);
     我们先将数字字符串转换为数字,进行数字运算,然后再格式化为数字字符串。格式化的时候,%06d的6指定为6位长度的数字字符串,0表示如果数字字符串不足6位则用0填充。如果不写0,如%6d,那么000001则被格式化为1了。

    最后提醒一下,你要区分数字字符串和数字的区别,是不同的数据类型。我们字面上看到的数字都是字符串,比如屏幕显示的数字,在纸上写的数字等等。所以在控制台输入数字和显示数字时都是数字字符哦。真正的数字你是看不到的,而是在CPU中进行计算的。就是我们在写代码是写的数字,我们看到的还是字符,我们的代码都是文本的格式。只是编译器会将代码写的数字转换为计算机中真正的数字。在控制台中输入的都是字符流,读取的也是字符流,而你输入的数字和读出的数字只是你按照数字的格式输入和获取转换得到的。

    注:看看C++技术网的C++入门教程的数字类型部分的章节,可以加深你对这些内容的理解。