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 也可以存进去 ,这都是怎么存的?

sprintf函数的原型如下:
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 数组也可以存进去?的主要内容,如果未能解决你的问题,请参考以下文章

如何将table转换为double型数组?

C语言中如何将double型数据转换为数组?

为啥 AnyVal (Int, Double) 不能是 scala.Serializable 参数的实际参数

float,double类型小数计算结果为啥不一样

为啥这种从 int 到 double& 的转换不起作用?

C++ 中的 Visual Studio MFC:为啥“int”有效但“double”无效?