2011-02-08 60 views
1

我正在C中編寫BCD(二進制編碼的十進制)並負責編寫不同的bcd函數。C中的BCD(二進制編碼的十進制)

我需要將整數i編碼到大小爲n的緩衝區char * s中。該函數在成功時返回0,在溢出情況下返回-1(編碼i需要大於n的緩衝區)。

下面是函數:int bcd_encode(int i, int n, char *s)

和樣本輸入:assert(bcd_encode(a, 128, s) == 0);

我寫的代碼功能bcd_encode並糾正我,如果我錯了,但我相信,在一個函數,只在函數如果你有一些func(char x[])和字符func(char *x)他們會是同樣的事情?所以你可以將它們看作一個char數組。如果它在函數定義之外char x[];將是一個char數組,並且char *x;將是一個指針。

int bcd_encode(int i, int n, char *s){ 
    int j = 0; 
    s = itoa(i, s, n+1); 
} 

但是,這會返回一個警告「賦值使指針從整型不帶轉換」和一個未定義的itoa符號。我已經嘗試了幾種不同的變體,從

* s = itoa(i); s = itoa(i); s = itoa(i,s,n + 1);

任何幫助,將不勝感激。提前致謝!

+0

也許你想在函數的最後返回一個`int`? – Peyman 2011-02-08 00:53:46

+1

`itoa`僅適用於MSVC++(AFAIK)。這不是標準C. – 2011-02-08 00:54:29

+1

這不是標準的C,但它被廣泛實施。 – payne 2011-02-08 01:12:09

回答

1

你說:

...並糾正我,如果我錯了,但我相信在一個函數,只有在一個功能,如果你有一些FUNC(焦X [])和炭FUNC (char * x)他們會是同一件事?所以你可以將它們看作一個char數組。如果它在函數定義之外char x [];將是一個char數組和char * x;將是一個指針。

倒不如把它們既作爲指針(而不是兩個數組)的函數裏面,但你的關鍵點 - 在函數參數列表,數組和指針之間的區別是模糊的,但其他地方的指針和數組是不同的。

在代碼中,由於假設itoa()在沒有信息的情況下返回一個整數,所以不能將它存儲在指針或指針中(不使用大錘投影,這會使代碼斷開) 。

itoa()返回什麼?它不是標準的C函數(如在,不在ISO/IEC 9899:1999中,也不在POSIX中)。Wikipedia建議它不返回任何值,所以你不應該在任何地方分配它的值。 Linux將它作爲<stdlib.h>中的非標準擴展,使用不同的接口返回char *(這是它的第二個參數的值)。你可以放心地忽略返回值;實際上,您也可以執行分配(在包含標題後),但分配是無操作的。您需要知道該功能是非標準的,它有多種定義,因此您必須瞭解平臺的正確性,或避免使用它(可以使用snprintf()代替)。


引用鏈接的Linux手冊頁:

char* itoa (int __val, char * __s, int __radix) 

轉換爲字符串的整數。

函數itoa()將val中的整數值轉換爲將存儲在s下的ASCII表示形式。調用者負責提供足夠的存儲空間。

注:
緩衝S的最小尺寸取決於基數的選擇。例如,如果基數爲2(二進制),則需要提供最小長度爲8 * sizeof(int)+ 1個字符的緩衝區,即每個位一個字符加一個字符串終止符。使用更大的基數將需要更小的最小緩衝區大小。 警告:
如果緩衝區太小,可能會導致緩衝區溢出。 轉換使用基數作爲基數,可能是2(二進制轉換)和最多36之間的數字。如果基數大於10,則'9'後面的下一個數字將是字母'a'。

如果基數爲10,val爲負值,則會預設一個負號。

itoa()函數返回以s傳遞的指針。

你不想用n+1作爲基數。

1
#include <stdlib.h> 

沒有包括,編譯器不知道什麼itoa()並將承擔其返回int

+0

嗯我有stdio.h不是stdlib但它仍然沒有錯誤(所以我會繼續挖) – Grant 2011-02-08 01:03:48

+0

它不是標準的C,所以#include的位置可能會有所不同。請參閱您的系統/編譯器的文檔。 – payne 2011-02-08 01:12:33

0

itoa()是未定義意味着你缺少的頭文件

#include < stdlib.h> 

如果它沒有定義,編譯器假設未知函數itoa()返回一個int(笨歷史原因)。

總是聽編譯器警告 - 他們是你的朋友!

1

該函數返回0成功或 -1溢出的情況下(其編碼i需要一個緩衝器大於n)。

但你並沒有這樣做。

int j = 0;

那是什麼?

s = itoa(i,s,n + 1);

你爲什麼分配給s?

我已經從

* S = itoa(ⅰ)嘗試了幾種不同的變化 ; s = itoa(i); s = itoa(i,s,n + 1);

隨機嘗試事情,直到你偶然發現一個工作不是一個好的編程方法。

指定爲s或* s在這裏不合適,並且顯示對C的理解不足;我強烈建議在語言中獲得更多的指導。一旦你這樣做,你可以使用的snprintf,例如,

#include <stdio.h> 
int bcd_encode(int i, int n, char *s){ 
    int r = snprintf(s, n, "%d", i); 
    return r < n? 0 : -1; 
} 

假設S是應該是NUL結束,並且n包括的NUL - 在你的描述中未作規定的細節。

順便說一句,這不是什麼「BCD」是指 - 見http://en.wikipedia.org/wiki/Binary-coded_decimal

相關問題