如何在C中的char数组中存储2位整数值和浮点值

时间:2013-07-25 13:59:58

标签: c

以下是我的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数组中存储整数和浮点值

3 个答案:

答案 0 :(得分:7)

我看到你得到答案的答案,但是没有给出解释,从外观来看,你可以使用一个很好的解释,所以这就是发生的事情:

C

中的类型

您需要了解不同类型(intcharfloatdouble)在内存中占用不同的大小。在C中,char总是被认为占用一个字节,并且在-127到128的范围内。(unsigned char从0到255.)int取最多4个字节,它们的范围从-2M到2M - 1. floatdouble分别占用4和8个字节,并且范围很大,但精度有限。 (有关更多信息,只需搜索“c类型范围”,您将找到许多信息,包括Stack Overflow上的这些链接,这些链接也为您提供了很好的解释:Definition of range of a data typeGuarantateed 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;。这是发生的事情:

  1. 你正在计数,从1.5开始,加上48,所以第一个数字是49.5。
  2. 编译器会自动将float更改为int,但它会给您一个警告。它通过截断值,将49.5更改为45来实现。
  3. 然后将(int)49更改为(char)49这是相同的值,但占用一个字节而不是4. Ascii 49为'1',所以这恰好是您想要的数字。< / LI>
  4. 编译器对浮动的其余部分做任何事情。它永远不会为此值设置sendBuffer [1]或[2]。
  5. 接下来的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';
....