1

文字列の長さに奇妙なバグがあります。私はこれにかなり慣れていないので、おそらく私が見逃している基本的なものです。

文字の配列 (つまり、文字列の最初の文字) へのポインターを取得し、最初の文字と同じサイズの文字列へのポインターを返すプログラムを作成しようとしていますが、文字が逆になっています。たとえば、Computer は retupmoC になります。tacocatはtacocatのままです:)

コードは次のとおりです。

char* return_flipped_string(char* stringptr)
{
    int i=0,size_of_string=length_of_string(stringptr);
    char *flipped;
    flipped=(char *)malloc(size_of_string*sizeof(char));
    while(i<size_of_string)
    {
        *(flipped+i)=*(stringptr+size_of_string-1-i);
        i++;
    }
    return flipped;
}

stringptr は元の文字列へのポインターであり、反転したのは私が返しているものです。反転した文字列を印刷すると、元の文字列が反転し、その後に見分けがつかない意味不明な文字列が表示されます。何らかの理由で同じサイズではありません。

文字列の長さを見つけるために私が書いたコードは次のとおりです(正常に動作します)

int length_of_string(char* stringptr)
{
    int length=0,i=0;
    while(*(stringptr+i)!='\0')
    {
        length++;
        i++;
    }
    return length;
}
4

4 に答える 4

4

反転された文字列の末尾にヌル バイト ('\0') を追加する必要があります。反転された文字列データ バッファーの長さは、入力文字列の長さにnull 文字列ターミネータ バイトの1 を加えた長さです。文字列がどこで終わるかを示すのはそのヌルバイトです。

于 2013-04-23T21:48:21.110 に答える
3

文字列を NULL で終了する必要があります....そのように..

  while(i<size_of_string)
    {
        *(flipped+i)=*(stringptr+size_of_string-1-i);
        i++;
    }
    flipped[size_of_string]=0;
    return flipped;
于 2013-04-23T21:48:04.957 に答える
1

NUL終了文字がありません。追加の1 文字を割り当て、最後にflippeda'\0'を明示的に追加する必要があります。

char* return_flipped_string(char* stringptr)
{
    int i=0,size_of_string=length_of_string(stringptr);
    char *flipped;
    flipped=(char *)malloc((size_of_string + 1)*sizeof(char));
    while(i<size_of_string)
    {
        *(flipped+i)=*(stringptr+size_of_string-1-i);
        i++;
    }
    *(flipped+1) = '\0';
    return flipped;
}

ところで-strlen標準ライブラリの機能を知っていますか?あなたのlength_of_string機能はそれを複製します。strrevANSI/ISO 標準に含まれているかどうかは思い出せません。

于 2013-04-23T21:49:53.283 に答える
0

C には文字列のようなものはありません。C には文字 ( char) 配列があり、 文字 ( )が含まれている場合、(慣例により) 文字列として解釈されます。最初に見つかった文字列が終了します。配列に が含まれていない場合、標準の文字列関数はいずれも、指定したアドレスから始まるバッファを null バイトに遭遇するまで読み取り続けます。 NUL'\0'NULNUL

したがって、ちんぷんかんぷん。

于 2013-04-23T21:54:55.457 に答える