1

私は主にJavaの人であり、C ++の知識があるため、Cに慣れていません。したがって、これが些細な質問である場合はご容赦ください。オンラインで検索しているときに答えが見つからなかったようです。

char配列を初期化しています...

char tcp[50];

constcharとcharを連結できるようにします。例では、これを行う簡単な方法は、空のchar配列を作成してから...を使用することでした。

strcat(x,y);

それらをくっつけるため。

問題は、「50」に設定されているときに空白のchar配列を出力すると、次の結果が得られることです。

X??|? 

に変更すると...

char tcp[100];

そしてそれを、その空白で印刷します。どうしてこれなの?

4

5 に答える 5

7

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

使用する:

char tcp[50] = "";

または:

char tcp[50] = {0};

または:

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

または:

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

好きなように。

于 2012-01-13T14:59:17.150 に答える
1

何かを行う前に、常に char 配列を null で終了します。

tcp[0] = '\0';
于 2012-01-13T14:59:39.210 に答える
1

C は、宣言した配列にスペースを喜んで割り当てますが、その内容を 0 に設定しません。

したがって、印刷している配列の内容はランダムです(または、メモリの以前の内容に依存します)

于 2012-01-13T14:59:56.107 に答える
1

配列を作成するとき、コンパイラはそれをメモリのどこかに配置しますが、初期化はしません。そのため、プログラムの開始時にそのメモリにあるものはすべて初期の「文字列」になります。

配列を作成した後、配列全体を「ゼロにする」か、ゼロを最初の文字として配置することにより、手動で文字列を終了します。

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

または

char tcp[50];
/* ... */
tcp[0] = '\0';
于 2012-01-13T15:01:41.353 に答える
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;
}

重要:strcat()長さチェックが実行されず、Java 以外では、これらの「文字列」は固定長 (変数を定義するときに設定した長さ) であるため、使用すると保存されない可能性があります。長さが指定されていない場合、初期化時に文字列をコピーすると、その長さが取得されます (たとえばchar test[] = "Hello!";、7 文字の長さになります (終了するため\0))。

文字列に対して Java のようなアプローチが必要な場合は、C++ とstd::stringクラスを使用してください。これは、Java の文字列にはるかに似た機能を実行します。

于 2012-01-13T15:04:08.013 に答える