字符串形式储存的数据,关键是看数据声明。char[] = "-1234",表明这是一个char数组,那么就要明白char是什么,这是一条解题的路线,你遇到问题,就要养成这样求解的习惯。一种数据类型,要么是语言内定的,要么是编程者自己构造,这点你要识别得出来。在这里,char是C语言的内置数据类型,由C语言法则规定,知道这点之后,就要调动记忆,检索char到底是怎样的概念,如果不清楚,就拿起书本复习。
在C语言中,char本质上是整数,而且是特别的整数,它是一个8位二进制整数。当某个数据被声明是char类型的时候,意思是指这个整数视为某个字符的编码,与你的学号一样,学号代表你的信息,字符的编码也代表某个具体字符的信息(顺序、字型、意义等等)。世界上有很多种编码体系,对ASCII码而言,字符'0'的编码是整数48,而且该编码方案规定,后续的'1'、'2'……是依次加1的整数(千万注意:ASCII码不是唯一的编码体系,C语言并不规定char必然采用ASCII编码体系,这与你所使用的编译器有关,它与你所在的地区的编码习惯关联,甚至,你完全可以采用自己独特的编码体系)。按照ASCII编码的约定,字符'1'的内码49比字符'0'的内码48大1,恰好是十进制数字1的值,很容易推演出'9'-'0'=9也是十进制数字9。这样,我们就可以通过内码减法来将字符转换为数值,这就是字符与数值之间互相转换的原理。
对字符串"-1234",你所需要的仅仅是分析出数组中最后的字符'4'是个位数、前一个是十位数这样的规律,那么你的编程,不过是考虑如何知道数组中某个字符是第几位数,对个位数就用它的内码乘以1、对十位数就用它的内码乘以10、对百位数就用它的内码乘以100,这里很明显有一种循环递增规律,找到这种规律,就能对任意位数的字符串进行转换。但你要注意,分析最前面的'-'号,那绝对影响转换结果。必须先把正负号判断好了,然后才能在不考虑符号的基础上进行转换。
编程,你要考虑的就是类似这样的东西。当你得到的字符串数字格式有点特异时(比如"-1,234"这样格式化了的数据),无法直接使用库函数转换,就得懂如何自己设计转换,这才是学编程的核心思想,最起码要了解如何才能做到,具体的实现做不出来没问题,但原理上你是知道一定可以的,那么若你手下某个程序员要耍滑头说做不来,直接叫他滚蛋就能唬住他,吓不倒你,死的只是他自己——将军难找,小兵多的是,他们没什么优势。
这种思维方式是你必须学会的。当给出的字符串不是十进制的时候,比如是十六进制,那么你就无法再用'A'-'0'来直接运算了,但知道原理,这根本难不倒你。对任何进制的转换,都难不倒你。因此,你不要以为知道atoi()之类的函数就算学会了编程、懂C语言了,不是那样的。
顺便提醒一下:C语言的char是一个8位二进制整数,但C#的Char是16位的。奉劝那些喜欢固定化数据尺寸的朋友,不要养成依赖太多假定的习惯。ASCII编码,不是唯一可能的C类char编码,写'1'-'0'就好,不要写'1'-48,这是很隐蔽的错误陷阱。不要看到人家说很厉害的代码就盲目相信,事实未必如此。
[
本帖最后由 TonyDeng 于 2011-9-18 13:33 编辑 ]