[英]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數組中存儲整數和浮點值嗎?
我看到您得到的答案已經回答了問題,但沒有給出解釋,從表面上看,您可以使用很好的解釋,所以這是發生了什么:
您需要了解不同類型( int
, char
, float
, double
)在內存中占用不同的大小。 在C語言中,始終將char
視為一個字節,並且其范圍為-127至128。( unsigned char
的范圍為0至255。) int
s占用4個字節,范圍為-2M到2M-1. float
和double
占用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;
。 這是發生了什么:
float
更改為int
,盡管它會警告您。 它通過截斷該值(將49.5更改為45)來實現。 (int)49
更改為(char)49
,這是相同的值,但占用一個字節而不是4。Ascii 49為'1',因此這恰好是您想要的數字。 接下來的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結果為“?”。 這就是輸出結果的方式。
最后,對解決方案說了幾句話:
由於您要做的只是輸出結果,因此不需要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的值,然后遞增它”。
因此,我代碼的第二行將從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.