2016-11-14 25 views
-1

因此,我是第一年C學生,我正在開發一個項目,在該項目中我們必須在用戶輸入的給定基礎中創建一個時間表。我幾乎完全完成了它,但是我無法從表格中刪除前導零。在C中重新分配字符串值

這就是簡單的底座10表的樣子。

[email protected] ~/cs211/project1 $ ./timesTable 10 

    | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |  
---|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----| 
0 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 
1 | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 
2 | 00 | 02 | 04 | 06 | 08 | 10 | 12 | 14 | 16 | 18 | 
3 | 00 | 03 | 06 | 09 | 12 | 15 | 18 | 21 | 24 | 27 | 
4 | 00 | 04 | 08 | 12 | 16 | 20 | 24 | 28 | 32 | 36 | 
5 | 00 | 05 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 
6 | 00 | 06 | 12 | 18 | 24 | 30 | 36 | 42 | 48 | 54 | 
7 | 00 | 07 | 14 | 21 | 28 | 35 | 42 | 49 | 56 | 63 | 
8 | 00 | 08 | 16 | 24 | 32 | 40 | 48 | 56 | 64 | 72 | 
9 | 00 | 09 | 18 | 27 | 36 | 45 | 54 | 63 | 72 | 81 | 
---|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----| 

我想從每個數字中刪除前導零,但我努力讓它工作。這是功能代碼的樣子。

char * toHex(int n, int q){ 

    static char hexNumber[4] = {0x00}; 
    char digits[16]={ '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 

    unsigned int un = q; 


    int i; 

    for(i=1; i>=0; i--){ 
     hexNumber[i] = digits[un%n]; 
     un=un/n;   
    } 
    if(strcmp(hexNumber, "0") == 0){ 
     hexNumber = " "; 
    } 
    return hexNumber; 
} 

使用我的邏輯,我試圖給hexNumber字符串重新分配給一個空的「」字符串,所以零點就是不出現,但我得到的錯誤:

timesTable.c: In function ‘toHex’: 
timesTable.c:68:13: error: incompatible types when assigning to type ‘char[4]’ from type ‘char *’ 
    hexNumber = " "; 

任何幫助將不勝感激。

+0

對不起,格式化它的帖子。我是新來的,並沒有格式化 –

+0

使用「memcpy(hexNumber,」「,2)」修復了錯誤,但不刪除任何零。 –

+0

當你說刪除前導零時,你的意思是「01」應該是「1」而不是?如果代碼爲「0」,您的代碼將只將hexNumber設置爲空格,我認爲這不會發生。 – sudo

回答

0

您不能重新指定char[]類型,也不能修改const char[]。所以,你必須做到:

  • char hexNumber[4] = {0x00};

而且當你要分配:

  • memcpy(hexNumber, " ", 2)(如果你已經strings.h進口)
  • hexNumber[0] = ' '; hexNumber[1] = '\0';如果你不(」 t想要導入任何東西)

編輯:上面修復了錯誤。爲了您的程序的正確性,也許這是你想用你的代碼替換你的if(strcmp...代碼?

for (i = 0; i < 3; i++) { 
    if (hexNumber[i] == '0') { 
     hexNumber[i] = ' '; 
    } else { 
     break; 
    } 
} 

這將從字符串的開頭檢查0個字符,用空格字符替換它們,直到到達非0字符。

您也不能返回hexNumber,如果你把它定義爲在棧上的數組,所以不是做char* hexNumber = malloc(4);然後memset(hexNumber, '\0', 4)(確保你import <strings.h>在頂部)。這將它分配到而不是堆棧。無論調用這個函數最終需要free結果,否則你會有內存泄漏。或者,你可以使這個函數接受hexNumber作爲輸入,並讓調用者分配它,但這是許多處理字符串的C庫函數所要做的。

+0

所以我現在得到了:andrew @ andrew-VirtualBox〜/ cs211/project1 $ gcc -g -Wall -o timesTable timesTable.c timesTable.c:在函數'toHex'中: timesTable。c:72:1:warning:函數返回局部變量的地址[-Wreturn-local-addr] return hexNumber; ^ 它不會刪除零。 –

+0

正確...你不應該返回'hexNumber',因爲它在這個函數的堆棧中。我只是想修復語法錯誤。編輯答案。你需要malloc而不是在堆棧上創建。並記住要釋放它。 – sudo

+1

您建議替換strcmp的代碼工作。我實際上嘗試了一個與之前非常類似的解決方案,但沒有得到它的工作。這使我尋找更復雜的路線。感謝您的幫助,我很高興這比我想象的要簡單得多。 –