5

私の問題は、文字を文字列に変換することです。文字列に追加する文字を strcat() に渡す必要があります。どうすればよいですか? ありがとう!

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

char *asd(char* in, char *out){
    while(*in){
        strcat(out, *in); // <-- err arg 2 makes pointer from integer without a cast
        *in++;
    }
    return out;
}

int main(){
    char st[] = "text";
    char ok[200];
    asd(st, ok);
    printf("%s", ok);
    return 0;
}
4

4 に答える 4

5

は初期化されていない文字の配列を指しているためok、すべてガベージ値になるため、連結 ( by strcat) が開始される場所は不明です。またstrcat、C 文字列 (つまり、'\0' 文字で終了する文字の配列) を取ります。与えるchar a[200] = ""と、a[0] = '\0' が返され、a[1] から a[199] が 0 に設定されます。

編集:(コードの修正版を追加)

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

char *asd(char* in, char *out)
{

/*
    It is incorrect to pass `*in` since it'll give only the character pointed to 
    by `in`; passing `in` will give the starting address of the array to strcat
 */

    strcat(out, in);
    return out;
}

int main(){
    char st[] = "text";
    char ok[200] = "somevalue"; /* 's', 'o', 'm', 'e', 'v', 'a', 'l', 'u', 'e', '\0' */
    asd(st, ok);
    printf("%s", ok);
    return 0;
}
于 2010-02-27T13:26:00.127 に答える
3

strcat単一の文字を追加しません。代わりにconst char*、最初のパラメーターの文字列に追加される (完全な C スタイルの文字列) を取ります。したがって、関数は次のようになります。

char *asd(char* in, char *out)
{
    char *end = out + strlen(out);

    do
    {
        *end++ = *in;

    } while(*in++);

    return out;
}

do-while ループには、C スタイルの文字列の末尾に必要なゼロ ターミネータが含まれます。出力文字列が最後にゼロターミネータで初期化されていることを確認してください。そうしないと、この例は失敗します。

余談ですが、何をするか考えてみてください*in++;。インクリメントinして逆参照しますが、これは とまったく同じなin++ので、*は役に立ちません。

于 2010-02-27T13:28:19.690 に答える
2

あなたのコードを見て、私はそれに関連していくつかのポインタを作ることができます.

  • 関数プロトタイプはありません。
  • ポインターの不適切な使用
  • 関数の処理strcatが正しく使用されていません。
  • asdやりすぎ -関数自体は必要ありません。
  • char適切に初期化されていない変数、特に配列の処理の使用。
#include <stdio.h>
#include <string.h>

intメイン(){
    char st[] = "テキスト";
    char ok[200];
    わかりました[0] = '\0'; /* また
    memset(OK, 0, sizeof(OK));
    */
    strcat(わかりました、st);
    printf("%s", OK);
    0 を返します。
}

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-02-27T13:30:50.250 に答える
0

文字を (null で終了する) 文字列に変換するには、次のようにします。

char* ctos(char c)
{
    char s[2];
    sprintf(s, "%c\0", c);
    return s;
}

作業例: http://ideone.com/Cfav3e

于 2014-02-01T23:27:26.537 に答える