以下是我的C代码来打印char的值,但我得到了意想不到的结果。代码是
#include<stdio.h>
main()
{
char sendBuffer[1000];
float count;
int i;
for(count=1.5;count<=2.5;)
{
for(i=0;i<=15;)
{
sendBuffer[0]=count+48;
sendBuffer[1]='a';
sendBuffer[2]='b';
sendBuffer[3]='c';
sendBuffer[4]=i+48;
sendBuffer[5]='\0';
printf("%s\n",sendBuffer);
i=i+5;
}
count=count+0.5;
}
}
我得到的结果是:
1abc0
1abc5
1abc:
1abc?
2abc0
2abc5
2abc:
2abc?
2abc0
2abc5
2abc:
2abc?
然而,我期待像
这样的东西1.5abc0
1.5abc5
1.5abc10
1.5abc15
等等。谁能告诉我如何在C?
中的char数组中存储整数和浮点值答案 0 :(得分:7)
我看到你得到答案的答案,但是没有给出解释,从外观来看,你可以使用一个很好的解释,所以这就是发生的事情:
您需要了解不同类型(int
,char
,float
,double
)在内存中占用不同的大小。在C中,char
总是被认为占用一个字节,并且在-127到128的范围内。(unsigned char
从0到255.)int
取最多4个字节,它们的范围从-2M到2M - 1. float
和double
分别占用4和8个字节,并且范围很大,但精度有限。 (有关更多信息,只需搜索“c类型范围”,您将找到许多信息,包括Stack Overflow上的这些链接,这些链接也为您提供了很好的解释:Definition of range of a data type,Guarantateed minimum size/range of C data types)。
此外,你知道足够的ascii知道要添加48到一个数字以获得char版本,但请确保附近有一个ascii表。方便的是,您可以在http://www.asciitable.com找到一个。
您还必须了解编译器将尽力从一个转换为另一个,但在某些情况下,例如将float
转换为int
,如果您不这样做明确地说,你的编译器至少应该发出一个警告。
字符串不作为C中的类型存在。而是打印到数组中。其他答案告诉你如何做到这一点。他们的代码正在做的是将您想要的值打印到字符数组中,这就是您所需要的。
现在,让我们看看您当前的代码在做什么:
首先,快速侧边栏:当你进行for
循环时,最好将增量放在循环中,所以:
for(count=1.5;count<=2.5;count=count+0.5)
{
for(i=0;i<=15;i=i+5)
会更加标准化。
现在,您的第一行是sendBuffer[0]=count+48;
。这是发生的事情:
float
更改为int
,但它会给您一个警告。它通过截断值,将49.5更改为45来实现。(int)49
更改为(char)49
这是相同的值,但占用一个字节而不是4. Ascii 49为'1',所以这恰好是您想要的数字。< / LI>
接下来的3行将字符串的第二,第三和第四个字符硬编码为abc
。即使您的第一行已将完整浮点值设置为sendBuffer
,也会覆盖它。
你的最后一行是i,它将是0,5,10和15,并将它加到48.这就像第一步,没有float
的截断。首先它查找ascii 48,即'0',然后是ascii 53,即'5'。当i
为10时,它现在采用int 58并将其转换为字符(再次将其从4个字节更改为1个字节)。打印ascii 58导致':',打印ascii 63导致'?'。这就是你的输出结果如何。
最后,关于解决方案的几句话:
由于您所做的只是输出结果,因此您不需要sendBuffer
也不需要snprintf
。只需使用
printf("%.1fabc%d\n", count, i);
就足够了。
考虑printf系列函数的作用是有益的。虽然效率较低,但让我们使用一些snprintf
来看看它在做什么:
int index = 0;
index = snprintf(&sendbuf[index], sizeof(sendbuf) - index, "%.1f", count);
index += snprintf(&sendbuf[index], sizeof(sendbuf) - index, "abc");
index += snprintf(&sendbuf[index], sizeof(sendbuf) - index, "%d", i);
sendbuf[index++] = '\n';
sendbuf[index] = '\0';
当你传递多个参数时,*printf
的作用是什么:跟踪你写了多少,并用它来告诉你在哪里写下一个部分。
如果您不知道,a += b
语法是a = a + b
的简写。 a++
表示“给我a的值,然后递增它。”
所以我的代码的第二行会将浮点值打印到sendbuf,从0开始。 *printf
始终返回打印的字符数,因此在此示例中,它将始终打印3个字符,并将index
设置为3。
下一行将字符串abc写入sendbuf,从位置3开始,然后在该行之后将i
的值打印到位置6.最后,我为新行添加\ n,并且最后一行是空终止符。我没有放index++
因为我不再关心索引了,所以不需要打扰它。我把\0
(就像你上面的那样)而不是0,因为\0
提醒程序员我们正在处理一个char数组,而不是一个整数数组。
同样,所有这些行都没有必要,但由于某些问题似乎是了解printf
的作用,我认为这会有所帮助。
答案 1 :(得分:5)
这可行:
snprintf(sendbuf, sizeof(sendbuf), "%.1fabc%d", count, i);
答案 2 :(得分:1)
向输出数组添加一个字节。第一个元素需要3个字符(字节)而不是一个。
sprintf(sendBuffer,"%0.1f",count);
sendBuffer[3] = 'a';
....