2

出力を作成できる次のプログラムへのユーザーからの入力となるものを理解するために、あなたの助けが必要です:U%ae'$ffq' ong string

int main(void) {
    int i=0;
    char j[22]="This is a long string", k[3];

    scanf("%2s ", k);
    sprintf(j, k);
    printf("%s", j);
    for (; i< 21; printf("%c", j[i++]))
        ;
    return 1;

}

私はいくつかのことを理解していません:

k はユーザーから 2 文字しか取得でき"%2s"ません。これはどういう意味ですか? 次に、j が指す配列に、配列 k が指すコンテンツを書き込むので、jは k を指すわけではありませんが、j[5]それでも取得できiます。j[0], j[1]したがって、入力が2文字に切り刻まれ、入力からの2文字になり、j[i]残りが「これは長い文字列」の元の残りになるため、この入力を取得する方法がわかりません。

4

1 に答える 1

3

ここでは推測しているだけですが、問題はおそらくループにあります。文字列ターミネータをチェックしませんが、文字列が終了しているかどうかに関係なく、すべての配列を出力します。

ループを次のように変更すると:

for (; i < 22 && j[i] != '\0'; printf("%c", j[i++])) ;

期待される出力が得られるはずです。

(注:配列のサイズも変更21しました。もちろん、それは同じです。)22i <= 21

編集: hmjdからのコメントの後に質問を読み直しています。

によって読み取られた入力にscanfパーセンテージ ( '%') 文字が含まれている場合、その後の呼び出しはsprintfそれを書式設定コードとして解析しようとします。%d123入力でこのプログラムをテストすると、期待どおりにkなります"%d"が、結果の配列jは になります"192795408\0long string"

于 2012-07-18T11:07:18.910 に答える