2014-11-05 68 views
-1

字符串下面的代碼打印整數值:存儲整數值在C

for (i=0 ; i<COL ; i++) 
{   
    fprintf(iOutFile,"%02x ",(int)(iPtr[offset]));  
} 

我想這些整數值存儲爲一個字符指針的字符串。爲此,我嘗試了下面的代碼,但它不起作用。

char *hexVal=""; 
    char *temp; 
    int val; 

    for (i=0 ; i<COL ; i++) 
    {   
     fprintf(iOutFile,"%02x ",(int)(iPtr[offset])); 
     val = (int)(iPtr[offset]);  
     temp=(char*) val; 
     hexVal = strcat(hexVal,temp);  
    } 
    printf("%s", hexVal); 

感謝名單.......

回答

1

你越來越不確定的行爲,因爲沒有可寫內存hexVal,這只是點在包含字符值爲0只讀區域。它是一個有效的字符串,但它是常量,長度爲0,不能附加到它。

另外,當然你不能把一個整數轉換成一個「字符串」,這不是C的工作原理。此:

temp=(char*) val; 

簡單地重新解釋的val值作爲一個指針(即,作爲一個地址),它不會奇蹟般地計算的用於表示地址的數字字符的正確序列,即它不將val轉換爲字符串。

您可以使用snprintf()將整數轉換爲字符串。

因此,要總結:

  • 變化hexval的宣言變成如char hexval[32] = "";,它將其聲明爲32個字符的數組,爲您提供足夠的空間來將字符串構建爲一個字符串。它初始化數組,使第一個字符爲0,從而使其成爲一個空字符串(有空間成長)。
  • 使用例如snprintf(tmp, sizeof tmp, "%d", 4711);將數字格式化爲十進制形式的字符串(應該是例如char tmp[16];)。
  • 使用strcat(hexval, tmp);連接新建數字字符串到hexval
  • 小心您不能連續永久連接,如果時間過長,您將耗盡空間。在這種情況下調整大小。
  • 檢查返回值時,請閱讀手冊頁(Google man FUNCTION,其中FUNCTION是標準C庫函數,如strcat)。
+3

'hexVal'被初始化,但它指向只包含'\ 0'的進程的只讀區域。 – 2014-11-05 09:23:53

+0

@BlagovestBuyukliev D'oh,我再也看不懂了。謝謝。固定。 – unwind 2014-11-05 09:28:08

+0

如果兩個答案綜合解決我的問題,我應該接受哪一個答案? – 2014-11-05 15:48:24

1

當你寫

char* hexVal = ""; 

要設置hexVal指向一個字符串,以後在你的代碼中嘗試的strcat到該地址,這將導致不確定的行爲。

你需要做的是分配一個足夠大的區域來容納你的結果字符串,然後讓hexVal指向那個區域。

E.g.

char* hexVal = malloc(100); // or how much bytes you need 

然後就去做

strcat(hexVal, temp); 

ALT。分配到堆棧

char hexVal[100]; 
1

您正在接近這個錯誤。一般來說,如果你有一個int i,那麼你不能只是將char *cp轉換成i的地址(或值),並期望它神奇地成爲一個字符串,你可以printf或在strcat中使用。首先,字符串是空終止的,並且沒有固定長度,而int具有通常爲32位長的固定大小。

您必須創建一個單獨的緩衝區(內存空間),其中snprintf將愉快地創建一個字符串表示爲您的int值。

我認爲你的問題更多的是理解編程,指針和C的工作方式,而不是關於int和字符串及其轉換。