C++题目--sprintf函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chen1083376511/article/details/91639442

题目:以下代码执行的结果是多少? 

char buffer[200],s[]="hello",c='c';
int i=35,j;
float fp=1.7320534f;
j=sprintf(buffer,"%s",s);
j+=sprintf(buffer+j,"%c",c);
j+=sprintf(buffer+j,"%d",i);
j+=sprintf(buffer+j,"%f",fp);
printf( "字符个数= %d\n", j );

参考答案

字符个数=16

【解析】

buffer作为把格式化的数据写入的字符串缓冲区。即输出结果为helloc351.732053,注意的是,其结果是不包括以’\0’结尾的字符。

题目:以下代码执行的结果是多少?

char s[20];
sprintf(s,"%d",123);
sprintf(s,"%-4d%-4d",123,456);//左对齐
sprintf(s,"%4d%4d",123,456);//右对齐
printf("%s",s);

参考答案

 123 456。

题目:以下代码执行的结果是多少?

char s[20];
sprintf(s,"%8x",4567);//右对齐,小写字母,11d7
sprintf(s,"%-8X",4567);//左对齐,大写字母,11D7
sprintf(s,"%08X",4567);//宽为8个字符,左边补零
printf("%s",s);

参考答案

000011D7

题目:以下代码执行的结果是多少?

char s[20];
short si=-1;
sprintf(s,"%04X",si);
printf("%s\n",s);
sprintf(s,"%04X",(unsigned short)si);
printf("%s\n",s);
sprintf(s,"%08X",(unsigned short)si);
printf("%s",s);

参考答案

FFFFFFFF

FFFF

0000FFFF

【解析】

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

题目:怎样把数字转为字符串(与atoi相反)?itoa函数吗?

【参考答案】

用sprintf就可以了:
sprintf(string,”%d”,number);

(不需担心用sprintf会小题大做,也不必担心会浪费运行时间或代码空间,实践中它工作得挺好。)

同理,也可以用sprintf把long型或浮点数转换成字符串(使用%ld或%f)。也就是说,可以把sprintf看成是atol和atof的反函数。同时,你也有一定的格式控制。因为这些原因,C提供sprintf作为通用解决方法,而不是itoa。

题目:以下代码输出结果为多少? 

char s[20];
sprintf(s,"%f",3.1415926);
printf("%s\n",s);//默认保留小数点为6位数字,3.141593
sprintf(s,"%-10.3f",3.1415926);//"3.142    ",10为宽度,3为3位小数
printf("%s\n",s);
sprintf(s,"%.3f",3.1415926);
printf("%s\n",s);

参考答案

3.141593

3.142

3.142

题目:输出结果为多少?

int i=100;
sprintf(s,"%.2f",i);
printf("%s\n",s);

参考答案

0.00 因为参数压栈时调用者并不知道跟i相对应的格式控制符是个”%f”。而函数执行时函数本身则并不知道当时被压入栈里的是个整数,于是可怜的保存整数i 的那4 个字节就被不由分说地强行作为浮点数格式来解释了,整个乱套了。

题目:以下代码输出结果是多少?

char a[20];
char *p="Hello,China";
cout<<p<<endl;
_snprintf(a,10,"%s",p);
printf("snprintf a is:%s\n",a);

【参考答案】

Hello,China

snprintf a is:Hello,Chin烫烫烫烫烫烫烫怍??

分析:p指向字符串,打印p时,则就把字符串打印出来了。但如果使用了_snprintf函数,其字符串拷贝到a数组当中,则由于只把10个字符(“hello,Chin”)拷贝到a数组,a数组剩下的10个字符并未初始化,所以输出”hello,Chin”之后就会乱码。

 

猜你喜欢

转载自blog.csdn.net/chen1083376511/article/details/91639442