簡體   English   中英

如何在C中的char數組中存儲2位整數值和浮點值

[英]How to store 2 digit integer value and float values in char array in 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數組中存儲整數和浮點值嗎?

我看到您得到的答案已經回答了問題,但沒有給出解釋,從表面上看,您可以使用很好的解釋,所以這是發生了什么:

C類型

您需要了解不同類型( intcharfloatdouble )在內存中占用不同的大小。 在C語言中,始終將char視為一個字節,並且其范圍為-127至128。( unsigned char的范圍為0至255。) int s占用4個字節,范圍為-2M到2M-1. floatdouble占用4和8個字節,並且范圍很大,但精度有限。 (有關更多信息,只需搜索“ c類型范圍”,您會發現很多信息,包括Stack Overflow上的這些鏈接,這些信息也為您提供了很好的解釋: 數據類型范圍的定義 ,保證的最小大小/范圍C數據類型 )。

另外,您知道足夠的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',因此這恰好是您想要的數字。
  4. 編譯器與浮子的休息做任何事情。 它永遠不會為此值設置sendBuffer [1]或[2]。

接下來的3 abc字符串的第二個,第三個和第四個字符硬編碼為abc 即使您的第一行將完整的float值設置為sendBuffer ,也會覆蓋它。

您的最后一行將i取為0、5、10和15,並將其加到48。這就像第一步一樣,沒有float截斷。 因此,首先查找ascii 48(即“ 0”),然后查找ascii 53(即“ 5”)。 i為10時,它現在使用int 58並將其轉換為字符(再次將其從4字節更改為1字節)。 打印ascii 58結果為“:”,打印ascii 63結果為“?”。 這就是輸出結果的方式。

可能的解決方案

最后,對解決方案說了幾句話:

由於您要做的只是輸出結果,因此不需要sendBuffersnprintf 只需使用

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的值,然后遞增它”。

因此,我代碼的第二行將從0位置開始將float值打印到sendbuf中。 *printf始終返回打印的字符數,因此在此示例中,它將始終打印3個字符,並將index設置為3。

下一行將字符串abc寫入sendbuf,從位置3開始,其后一行將i的值打印到位置6。最后,我在新行中添加\\ n,最后一行是空終止符。 我不放置index++因為我不再關心索引,因此不必費心增加索引。 我把\\0 (如上所述)代替了0,僅僅是因為\\0提醒程序員我們正在處理char數組,而不是整數數組。

同樣,所有這些行都是不必要的,但是由於某些問題似乎是在理解printf功能,因此我認為這會有所幫助。

這可以工作:

snprintf(sendbuf, sizeof(sendbuf), "%.1fabc%d", count, i);

向輸出數組添加一個字節。 第一個元素需要3個字符(字節)而不是一個。

sprintf(sendBuffer,"%0.1f",count);
sendBuffer[3] = 'a';
....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM