sprintf函数的使用

学C语言的同学对printf函数都不陌生。从世界上第一个程序(我认为的)”hello world”到你手里正写的某个程序,都少不了printf的影子。不过你也许不知道,printf还有一些兄弟——比如wprintf、sprintf等。

过几天就要考C语言了,学校先把上机考试的系统公布了,里面有十几道测试题目让我们练练手。都是一些基础题,像什么水仙花数、哥德巴赫猜想之类的(好像这些题已成了必不可少的经典)。其中有一道题,简化一下就是这样:输入一个不长于9位的整数,输出每个位子上的数字的和,比如输入123,输出1+2+3=6。

基础题,用字符串来写可以是这样:

#include<stdio.h>
void  main(){
    char  ch[9]={'0'};
    int  i=0,c,s=0;
    while((c  =  getchar()) !=  'n')
       ch[i++]  =  c;
    i=0;
    while(ch[i]  !=  '')
       s+=ch[i++]-'0';
    printf("%dn",s);
}   

写题的时候发现,”不长于9位的整数”这个条件很微妙。9位就是亿位,我们知道long最大到21亿,也就是说我们这个数是可以保存在一个long型变量里的。就这样,我想到如果有一个现成的函数,能把一个数变成一个字符串,那就方便多了。非标准库里提供了一个itoa函数,标准库里提供了一个sprintf函数。

sprntf函数功能挺强大的,可以格式化任意类型的参数并存入字符串中。函数原型是这样:

int sprintf( char *buffer, const char *format, [ argument]  );

buffer是个字符串数组,保存我们需要得到的数据。format是个字符串,比如”%d%d”,和printf里第一个参数相似。[argument]就是任意类型的数据,比如整型。

举个例子,sprintf(ch,"%ld",123456789); 什么意思?将长整型数123456789保存在字符数组ch里。就如同我们的printf("%ld",123456789);作用是输出长整型数123456789。

那么我们这一题还可以这样写:

#include<stdio.h>
void  main(){
  long n;
  char  ch[10]={'0'};
  int  i=0,s=0;
  scanf("%d",&n);
  sprintf(ch,"%ld",n); //将n格式化保存在字符数组ch中
  while(ch[i]  !=  '')
  s +=  ch[i++]-'0';
  printf("%dn",s);
}

如此一来,程序好想了不少。不过,sprintf可不是我们想象中的那么简单,用不好也会给我们带来大麻烦。比如缓冲区溢出的问题,假如用户输入的数不止9位,ch数组可就装不下了,后果可不是程序出错那么简单。还有,sprintf的宽字节与窄字节问题与对中文的支持问题也不是那么简单,这些我都碰到过,以后再讲。

今天说到的这个用法确实可以使我们的程序简单多了。另外,我在文章开头提到了itoa函数,这个函数和sprintf函数效果相似,但因为不是标准库函数,所以部分编译软件并不能识别。(在windows下itoa函数一般来说可以使用)

函数原型:

char *itoa(int value, char *string, int radix);

value指被转换的整数,string指保存结果的字符数组,radix指转换成的进制。比如我想把23转换成二进制数保存在ch数组里,直接itoa(23,ch,2);就可以实现。相对的,还有一个函数atoi,大家google查查什么意思,以后也会经常用到。

相关推荐: Python ICMP协议打造半连接后门

思路 思路来自之前写后门的一点想法,socket通信有端口的连接,所以暴露很容易的事。所以考虑写这种半连接式的后门,将要执行的指令藏在其他数据包中,通过截获数据包中的数据进行两边的交互。确实也有像贾师傅说的资源消耗的问题。不过我觉得对于一个后门来说,比起资源消…

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论