0
void slice_first_char(char ** string)
{
    *string = &(*string[1]);
}

int main(int argc, char * argv[])
{
    char * input = "abc";
    input = &(input[1]);
    puts(input); // "bc" as expected.

    slice_first_char(&input);
    puts(input); // \372\277_\377
                 // What‘s going on?
}

期待どおりに動作するように、slice_first_char 関数を書き直すにはどうすればよいですか?

4

2 に答える 2

11

あなたは括弧を持っています

&(*string[1]);

違う。私はあなたが意味したと思います

&((*string)[1]);

元のバージョンは、strings配列の最初の要素のポインターを逆参照し、そのアドレスを取得しますが、実際には特定のポインターを逆参照したいのですが (単一の文字列を指しているため)、その最初の要素を取得します (最初の文字) を取得し、そのアドレスを取得します。

これを表現するためのやや複雑でない方法は次のようになります。

*string + 1

ところで。

于 2012-09-21T15:52:01.830 に答える
3

文字列から最初の文字を削除しようとしているようです。そう:

char* remove_first_char(const char* s) {
  return (s+1);
}
于 2012-09-21T15:53:34.680 に答える