-4

以下の関数を使用して char を char* に変換できます

char* char_to_chars(char ch) {
    char ch2[10];
    ch2[0] = ch;
    char *ch3 = &ch2[0];
    return ch3;
}

ここで上記の関数を呼び出していますが、必要なものが得られますが、まだ問題があり、何が問題なのかわかりません

char *ch2=char_to_chars(ch);

しかし、私が書くcout<<ch2;とアドレスが印刷されます

そして、私が書くcout<<*ch2;と、変換された文字が出力されます

cout<<ch2変換された文字を出力する必要があります

自分の機能または他の場所で何を変更する必要がありますか

アップデート

このコードを使用して連結を行っています。

char*lval = "bhavik";
char* concat(const char *nval) {
    int len = strlen(lval) + strlen(nval) + 1;
    char *temp = lval;
    lval = (char*) malloc(len * sizeof (char));
    strcpy(lval, temp);
    strcat(lval, nval);
    return lval;
}

これでいいですか?

4

3 に答える 3

3

OPへのコメントで議論した後、間違った問題について質問しているようです。char私が理解していることから、既存の の最後にを連結したいと考えていますchar*char*が null で終わる文字列 (一般に C 文字列と呼ばれます) を指している場合、charを既存の C 文字列の最後にコピーしNULL、追加された の直後の場所に文字を移動する必要がありますchar。合法的にこれを行うことができるように、実際に に十分なメモリを割り当てていることを確認してくださいchar*

于 2013-07-03T18:44:37.110 に答える
2

実行cout<<ch2;すると、それが指している値が出力されず、メモリ内のその値のアドレスが出力されます。を実行してポインターを逆参照せずに、ポイントされている値を出力することはできません。cout << *ch2;

あなたと共有したいいくつかのヒントもあります。ch1まず、変数にch2、 、 などよりも適切な名前を付けることを強くお勧めしますch3。第二に、あなたの関数は多くの不要なアクションを実行します。このようにしてみてください:

char* char_to_chars(char ch) {
char* convertedChar = new char;
*convertedChar = ch;
return convertedChar;
}

これにより、新しいポインターが作成され、値を格納するためにヒープに領域が割り当てられます。これは、char をポインターに変換するためのより明確で効率的な方法です。ただし、関数なしで行うこともできます。

char* somePointer = &yourCharToConvert;

しかし、簡単に言うと、 と入力するだけでポインタに格納されている値を出力しようとしている場合、それはうまくいきcout<<ch2;ません

于 2013-07-03T19:02:50.377 に答える
0

問題はch2、スタック内の配列を (ローカル変数として) 初期化することです。関数が戻ると、スタック フレームが消去され、配列が「削除」されます (実際には、スタック フレームは消去され、他の関数呼び出しやローカル変数で使用され、他の値で上書きされるため、返されるポインターはジャンクを指す)。配列をヒープにmallocする必要があります。

この方法ではヒープを使用します。

char* char_to_chars(char ch) {
    char *ch2 = malloc(10 * sizeof(char));
    ch2[0] = ch;
    return ch2;
}

2 つの を連結したい場合char*は、組み込み関数strcatstrncat関数を使用できます。十分なメモリが割り当てられていることに注意してください。

于 2013-07-03T18:39:22.130 に答える