1

以下のCプログラムは、16ワードの文字列の最初と最後の文字を出力します。

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

void main()
{
    char first, last;
    char *str = "abcdefghijklmnop";
    first = str[0];
    last = str[15];
    printf("%s", &first);
    printf("%s", &last);
}

私が探している出力はaとpです。しかし、このコードを実行すると、次の出力が得られます。

apa

私は何が間違っているのですか?

4

3 に答える 3

3

ポインターの理解が不足しています。と に文字を割り当てるfirstlast、それらの文字は基本的に と にコピーされfirstますlastfirstlastは別個の変数であるため、それらのアドレスはポインターとは関係ありませんchar *str。また、printf("%s", &first);(最後と同じ) printf は 0 で終わる文字列を想定しているため、未定義の動作を呼び出しますが、1 文字のみを渡し、その後にゼロ ターミネータはありません。

あなたができることは、ポインタを使用することです:

char *first = str + 0;
char *last = str + 15;
printf("%s %s", first, last);

これは印刷されますabcdefghijklmnop p

または2文字のみを印刷するには:

char first = str[0];
char last = str[15];
printf("%c %c", first, last);

これは印刷されますa p

于 2012-09-20T06:24:13.500 に答える
2

以下の行は正しい結果をもたらします

printf("%c", first );
printf("%c", last );
于 2012-09-20T06:23:23.220 に答える
1

変数firstlastは、文字列/ポインターではなく、実際の文字値です。代わりに %c を使用する必要があります。試す:

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

void main()
{
    char first, last;
    char *str = "abcdefghijklmnop";
    first = str[0];
    last = str[15];
    printf("%c", first);
    printf("%c", last);
}

%s、文字値の配列を指すポインタを取得し、NULL 文字に到達するまで読み取り続けることを期待しています\0

詳細については、http://pw1.netcom.com/~tjensen/ptr/ch3x.htmhttp://www.codingunit.com/printf-format-specifiers-format-conversions-and-formattedをご覧ください。 -出力

次の C++ ページには、ポインターを視覚化するためのより優れた図がありますhttp://cplusplus.com/doc/tutorial/pointers/

于 2012-09-20T06:24:19.863 に答える