2017-04-18 21 views
0

C言語を初めて使用しています。 char配列とcharを連結する必要があります。 javaでは '+'演算を使用できますが、Cでは使用できません。 Strcatとstrcpyも私のために働いていません。どうすればこれを達成できますか?char配列とcharを連結する

void myFunc(char prefix[], struct Tree *root) { 
    char tempPrefix[30]; 
    strcpy(tempPrefix, prefix); 
    char label = root->label; 
    //I want to concat tempPrefix and label 

私の問題は、それが他とのcharの配列をCONCATとしてconcatenate char array in Cとは異なり、次のように私のコードですが、私のは除いて(

+2

[Cの連結文字配列]の複製があります。(http://stackoverflow.com/questions/2218290/concatenate-char-array-in-c) –

+1

は、前の質問とどのように私の違いがあるのですか? –

+0

へようこそスタックオーバーフロー!これまでのところあなたの研究/デバッグの努力を示してください。まず[Ask]ページをお読みください。 –

答えて

1

。主な懸念は、tempPrefixに接頭辞+元の文字のための十分なスペースがあることです。 Cの文字列はnullで終了する必要があるため、関数は接頭辞の28文字を超えてコピーしてはいけません。それは30(バッファーのサイズ) - 1(ルートラベル文字)-1(終了ヌル文字)です。幸いな標準ライブラリはstrncpyがあります

size_t const buffer_size = sizeof tempPrefix; // Only because tempPrefix is declared an array of characters in scope. 
strncpy(tempPrefix, prefix, buffer_size - 3); 
tempPrefix[buffer_size - 2] = root->label; 
tempPrefix[buffer_size - 1] = '\0'; 

したがって、あなたは最小限の変更でそのサイズを大きくすることができ、ハードコードにないも、関数呼び出しのバッファサイズ価値があります。


あなたのバッファが正確にフィットしていない場合は、より多くの足跡が必要です。このアプローチはこれまでとほぼ同じですが、画像を完成させるにはstrchrへの呼び出しが必要です。

size_t const buffer_size = sizeof tempPrefix; // Only because tempPrefix is declared an array of characters in scope. 
strncpy(tempPrefix, prefix, buffer_size - 3); 
tempPrefix[buffer_size - 2] = tempPrefix[buffer_size - 1] = '\0'; 
*strchr(tempPrefix, '\0') = root->label; 

もう一度28文字をコピーします。しかし、明示的にNULバイトで終わりを埋める。現在、strncpyは、コピーされる文字列が短い場合には、countまでのNULバイトでバッファを満たしているので、実際にコピーされた接頭辞の後のすべてが\0になります。このため、私はすぐにstrchrの結果を尊重し、有効な文字を指すことが保証されています。正確な最初の空き領域。

+0

私はここに出力が期待されていません。私は追加されたcharが私のtempPrefix char配列の28番目の場所にあるのがわかりますが、それを印刷するとそこにはありません。配列の最後ではなく、配列内の現在のテキストの次の位置に連結してはいけません。 –

+0

@GeorgeKlimas - マイナーな間違いが私のところにあります。 'strncpy'は、大部分の* count文字を含む*をコピーします。それはそれへの呼び出しを調整する必要があることを意味します。詳細については私の編集を参照してください。 – StoryTeller

+0

まだchar配列に文字が追加されていません。デバッグは、キャラクターが28の位置に追加されていることを示しています。 –

0

strXXX()は、機能の家族はほとんど文字列で動作するのcharとchar型の配列です関連するものを検索する)ので、ライブラリ関数を直接使用することはできません。

既存のヌルターミネーターの位置を確認し、連結する数値のcharに置き換えて、その後にヌルターミネーターを追加します。ただし、連結された文字列を保持するのに十分な余裕がソースに残っていることを確認する必要があります。

本当にむしろシンプルなこのような何か(テストしていません)

#define SIZ 30 


//function 
char tempPrefix[SIZ] = {0};  //initialize 
strcpy(tempPrefix, prefix); //copy the string 
char label = root->label;  //take the char value 

if (strlen(tempPrefix) < (SIZ -1)) //Check: Do we have room left? 
{ 
    int res = strchr(tempPrefix, '\0'); // find the current null 
    tempPrefix[res] = label;    //replace with the value 
    tempPrefix[res + 1] = '\0';   //add a null to next index 
} 
+0

ここに出力がありません。 'res'がマイナスの値になっているのが分かります。それは問題ですか? –

関連する問題