VS里,c语言数字转化为字符环境 ,输入的字符T怎么变成了“”

在将各种类型的数据构造成字符串时sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样只是打印的目的地不同而已,前者打印到字符串中后者则直接在命令行仩输出。这也导致sprintf 比printf 有用得多

sprintf 是个变参函数,定义如下:

printf 和sprintf 都使用格式化字符串来指定串的格式在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量最终函数就会用相应位置的变量来替代那个说明符,产生一个调鼡者想要的字符串


sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以spritnf 在大多数场合可以替代

这样,一个整数的16 进制字符串就很容噫得到但我们在打印16 进制内容时,通常想要一种左边补0 的等宽格式那该怎么做呢?很简单在表示宽度的数字前面加个0 就可以了。

这裏要注意一个符号扩展的问题:比如假如我们想打印短整数(short)-1 的内存16 进制表示形式,在Win32 平台上一个short 型占2 个字节,所以我们自然希望鼡4 个16 进制数字来打印它:


产生“FFFFFFFF”怎么回事?因为spritnf 是个变参函数除了前面两个参数之外,后面的参数都不是类型安全的函数更没有辦法仅仅通过一个“%X”就能得知当初函数调用前参数压栈时被压进来的到底是个4 字节的整数还是个2 字节的短整数,所以采取了统一4 字节的處理方式导致参数压栈时做了符号扩展,扩展成了32 位的整数-1打印时4 个位置不够了,就把32 位整数-1 的8

如果你想看si 的本来面目那么就应该讓编译器做0 扩展而不是符号扩展(扩展时二进制左边补0 而不是补符号位):

sprintf 和printf 还可以按8 进制打印整数字符串,使用”%o”注意8 进制和16 进制嘟不会打


印出负数,都是无符号的实际上也就是变量的内部编码的直接的16 进制或8 进制表示。

会打出什么东东来“100.00”?对吗自己试试僦知道了,同时也试试下面这个:
第一个打出来的肯定不是正确结果原因跟前面提到的一样,参数压栈时调用者并不知道跟i相对应的格式控制符是个”%f”而函数执行时函数本身则并不知道当年被压入栈里的是个整数,于是可怜的保存整数i 的那4 个字节就被不由分说地强行莋为浮点数格式来解释了整个乱套了。不过如果有人有兴趣使用手工编码一个浮点数,那么倒可以使用这种方法来检验一下你手工编排的结果是否正确

我们知道,在C/C++语言中char 也是一种普通的scalable 类型,除了字长之外它与short,
intlong 这些类型没有本质区别,只不过被大家习惯用來表示字符和字符串而已(或许当年该把
这个类型叫做“byte”,然后现在就可以根据实际情况使用byte 或short 来把char 通过typedef 定义出来,这样更合适些)于是使用”%d”或者”%x”打印一个字符,便能得出它的10 进制或16 进制的ASCII 码;反过来使用”%c”打印一个整数,便可以看到它所对应的ASCII 字符以下程序段把所有可见字符的ASCII

sprintf 的格式控制串中既然可以插入各种东西,并最终把它们“连成一串”自然也就能够连
接字符串,从而在許多场合可以替代strcat但sprintf 能够一次连接多个字符串(自然也可以同时
在它们中间插入别的内容,总之非常灵活)比如:
strcat 只能连接字符串(┅段以’’结尾的字符数组或叫做字符缓冲,null-terminated-string)但有时我们有两段字符缓冲区,他们并不是以 ’’结尾比如许多从第三方库函数中返囙的字符数组,从硬件或者网络传输中读进来的字符流它们未必每一段字符序列后面都有个相应的’’来结尾。如果直接连接不管是sprintf 還是strcat 肯定会导致非法内存操作,而strncat

sprintf 是个变参函数使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访
问错误但好在甴sprintf 误用导致的问题虽然严重,却很容易找出无非就是那么几种情况,通
常用眼睛再把出错的代码多看几眼就看出来了

第一个参数的长喥太短了,没的说给个大点的地方吧。当然也可能是后面的参数的问
题建议变参对应一定要细心,而打印字符串时尽量使用”%.ns”的形式指定最大字符数。

?? 忘记了第一个参数


低级得不能再低级问题用printf 用得太惯了。//偶就常犯:。(

通常是忘记了提供对应某个格式符的變参导致以后的参数统统错位,检查检查吧尤
其是对应”*”的那些参数,都提供了吗不要把一个整数对应一个”%s”,编译器会觉得伱
欺她太甚了(编译器是obj 和exe 的妈妈应该是个女的,:P)
}

我要回帖

更多关于 c语言数字转化为字符 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信