sprintf为啥用int和double 数组也可以存进去?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sprintf为啥用int和double 数组也可以存进去?相关的知识,希望对你有一定的参考价值。
#include<stdio.h>
int main()
int i;
int s[20];
int a=12345;
sprintf(s,"%d.gfjg",a);
printf("%s\n",s);
for(i=0;s[i]!=0;i++)
printf("%d ",s[i]);
return 0;
这是随便写的,,数组是int , 输出s的时候输出的是12345.gfjg是对的, 但是把s一个一个输出就成了乱七八糟的 而且把int数组换成double 也可以存进去 ,这都是怎么存的?
int sprintf(char *str, const char *format, ...);
第一个参数是一个char类型的指针,不是太精准的说法则可以说是一个地址。
对于char s[20]; int s[20]; 这两个变量的区别,字面上的区别是数据类型不同,但是这两个变量申请的内存空间却是没什么区别的(当然内存大小不同)。所以在使用int型s作为sprintf时也可以使用,只不过是打印到s所在的地址空间。
再说下最后打印的结果,首先你的s要进行初始化:
int s[20]=0;
这样才能更好的看到结果,然后输出使用%c,结果是:
15j
这样就很好解释了,首先能确定的是:12345.gfjg打印到了s开始的内存空间内(每字节打印),在使用%s进行输出时,是按照字节逐个进行打印,直到遇到‘\0'停止打印,所以打印出所有的:12345.gfjg。
当使用s[i]进行打印时,每个变量都是一个int型,int占4个字节,也就是说s[0]内保存的是:1234的char型数据,s[1]保存的是5.gf的char型,s[2]保存的是jg的char型,如果是用%d打印,就会把1234转换成整形打印,如果使用%c打印就只会打印首地址的值,即s[0]对应的1,s[2]对应的5.。。。所以最后的结果:15j (当然后面还有很多空格,就是s初始化为0按照%c打印出来的)。 参考技术A for(i=0;s[i]!=0;i++)
printf("%d ",s[i]);
你这个是输出每个元素的ASCII码值了。
改成这样的话:
for(i=0;s[i]!=0;i++)
printf("%c",s[i]);
效果就跟
printf("%s",s);一样了。
对字符型变量char他在内存中存的是这个字符的ascii码值,
比如你char a='1';字符1不是整数1
printf("%d",a);输出的就是字符1的ASCII码值49.
其实把int换成double一样的,关键是你输出时的格式控制符是什么
输出字符就是%c,输出整数是%d,输出浮点数就是%f
sprintf函数目的就是把不同类型的变量统一转化成字符串的形式输出。追问
for(i=0;s[i]!=0;i++)
printf("%d ",s[i]);
数组int输的不是ASCLL码啊,
但把数组s改成char就是ASCLL码了..
哦,我看错了,
int s[20];
这个要改成char s[20];
C++ 中的 Visual Studio MFC:为啥“int”有效但“double”无效?
【中文标题】C++ 中的 Visual Studio MFC:为啥“int”有效但“double”无效?【英文标题】:Visual Studio MFC in C++: Why is "int" working but not "double"?C++ 中的 Visual Studio MFC:为什么“int”有效但“double”无效? 【发布时间】:2015-07-29 06:41:37 【问题描述】:我正在使用 Visual Studio 2013 来构建使用 MFC 应用程序的 UI。我使用“编辑控件”来获取三个数字输入和一个按钮,该按钮将产生一个对话框,说明这些输入的值。当编辑控件框中的变量是整数时,它可以正常工作。当它们是双打时,我得到两个值的 0 和第三个随机值。这是我按下按钮的代码:
void CMFCApplication4Dlg::OnBnClickedButton2()
UpdateData();
CString temp2;
temp2.Format(_T("The frequency is %d Hz, the pulse width is %d ms, the duration is %d ms"), frequency, pulsewidth, duration);
MessageBox(temp2, 0, MB_ICONINFORMATION);
我怎样才能使这项工作适用于双打?我完成的应用程序必须进行一些需要小数的计算,因此整数不是一个选项。当我使用浮点数时,我也遇到了同样的问题。
这是我的第一个问题,我不是一个很好的程序员,所以如果这是微不足道的,我深表歉意。
【问题讨论】:
做一点网络搜索怎么样? CString::Format 【参考方案1】:该 %d 仅适用于整数。试试%.2f
。不包括最后一个时期。这应该会给你一个带两位小数的数字,但我没有用谷歌搜索任何东西,所以请检查我的语法。
【讨论】:
以上是关于sprintf为啥用int和double 数组也可以存进去?的主要内容,如果未能解决你的问题,请参考以下文章