2016-11-14 10 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';(あなたはドンが」輸入したくない)

編集:上記はエラーを修正します。あなたのプログラムの正確さのために、これはあなたのif(strcmp...コードをあなたが置きたいと思うかもしれませんか?

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

これは、それが非0の文字に達するまで空白文字に置き換える、0文字の文字列の先頭からチェックします。

あなたは(あなたの一番上にimport <strings.h>を確認してください)あなたは、スタック上のアレイとしてそれを定義する場合もhexNumberを返すことができませんので、代わりに、その後memset(hexNumber, '\0', 4)char* hexNumber = malloc(4);を行います。これにより、スタックの代わりにヒープに割り当てられます。この関数を呼び出しても最終的にはfreeになる必要があります。そうしないと、メモリリークが発生します。あるいは、この関数が入力としてhexNumberを受け入れるようにして、呼び出し側がそれを必要に応じて割り当てるようにすることができます。これは、文字列を扱う多くのCライブラリ関数が行うことです。

+0

それでは、私は次のようになります:andrew-andrew-VirtualBox〜/ cs211/project1 $ gcc -g -Wall -o timesTable timesTable.c timesTable.c:関数 'toHex'で: timesTable。c:72:1:警告:関数はローカル変数のアドレスを返します[-Wreturn-local-addr] return hexNumber; ^ そして、ゼロは削除されません。 –

+0

右...この関数のスタック上にあるので、 'hexNumber'を返さないでください。私は構文エラーを修正しようとしていました。答えを編集する。スタック上に作成する代わりにmallocする必要があります。そして後にそれを解放することを忘れないでください。 – sudo

+1

strcmpを置き換えることを提案したコードが機能しました。私は実際には以前のそれと非常によく似た解決策を試しましたが、うまく機能しませんでした。その結果、私はより複雑なルートを探しました。助けてくれてありがとう、私は思ったよりずっと簡単だったのでうれしいです。 –

関連する問題