2012-01-13 13 views
1

私はC++に精通しているので、私は主にJavaの人間であるので、私はCに慣れていないので、些細な質問であれば許してください。オンラインで検索しているうちに答えが見つからないようです。私はchar型の配列を初期化していますChar x [50]とChar x [100]出力

...私はのconst char型や文字を連結することができるよう

char tcp[50]; 

。例では、私はこれを行う簡単な方法は、その空のchar型の配列を作成し、それらを一緒に固執する...

strcat(x,y); 

を使用していた見ました。

問題は、それが「50」に設定されている場合、空白文字列をプリントアウト、である私の結果得られます...私はそれを変更すると

X??|? 

char tcp[100]; 

そして、それを印刷してください。どうしてこれなの?

+1

cでは、null(0x0)文字で文字列を明示的に終了する必要があります。 – StuartLC

+0

申し訳ありませんが、 "const charとcharを連結する"とは何ですか?それはこの文脈では意味をなさないと思われる。また、何かをstrcattingする前に、あなたは必ずtcp配列を初期化していますか? –

+0

私はconst charの内容を編集できないので、空の配列の別のcharと組み合わせています。少なくともそれは計画だった。 – Max

答えて

7

ローカル(自動)配列であると仮定すると、配列の内容は未定義です。

使用:

char tcp[50] = ""; 

または:

char tcp[50] = {0}; 

または:

char tcp[50]; 
tcp[0] = 0; 

または:yと

char tcp[50]; 
memset(tcp, 0, sizeof(tcp)); 

ああ、好きです。

1

は常に何かを行う前に、あなたのcharの配列を終了ヌル:

tcp[0] = '\0'; 
1

C喜んであなたが宣言し、配列のための領域を割り当てますが、それは、したがって、0

にコンテンツをそのコンテンツを設定しません印刷しようとしている配列の配列はランダムです(以前のメモリの内容によります)

1

コンパイラは配列を作成する際に、メモリのどこかに入れますが、初期化しません。プログラムはstですartedは最初の "文字列"になります。

あなたは、配列を作成した後、全体の配列を作るのいずれかによって、手動で文字列を終了して「ゼロ」、または単に最初の文字としてゼロを置く:

char tcp[50] = { '\0' }; 

それとも

char tcp[50]; 
/* ... */ 
tcp[0] = '\0'; 
+0

最初のスニペットでは、次の要素がすべてゼロになるため、 ''\ 0''は無意味です。 '' \ 1''が最初の要素の初期化子であった場合、次の要素はすべて0になります。これを考えると '{}'はより明確になります。 –

0

違いは、本質的には、空の2つの配列を1つのメモリ空間にマージしようとしていることです。

まず、Cでは、文字列を\0で終了する必要があります。これは、Javaでは公開されていない、または表示されていないものです。また、基本的に2つの未定義の文字列を使用しています(値が設定されていないため)。

#include <stdio.h> 
#include <string.h> 

char target[256]; 
const char source_a[] = "Hello"; 
const char source_b[] = "World!"; 

int void(main) 
{ 
    target[0] = '\0'; // this essentially empties the string as we set the first entry to be the end. Depending on your language version of C, you might as well write "char target[256] = {'\0'};" above. 
    strcat(target, source_a); // append the first string/char array 
    strcat(target, " "); // append a const string literal 
    strcat(target, source_b); // append the second string 

    printf("%s\n", target); 

    return 0; 
} 

重要:何の長さのチェックを行っ、およびJava以外はありませんようstrcat()を使用すると、UNSAVEすることができ、これらの「文字列は」固定長(変数を定義するときに設定するもの)を持っています。長さが指定されていないが、初期化時に文字列をコピーすると、その長さが使用されます(例:char test[] = "Hello!";は7文字分長くなります(\0が終了するため)。

文字列に対してJavaのようなアプローチをしたい場合は、C++とstd::stringクラスを使用します。これは、Javaの文字列とよく似ています。