0

たとえば、「qwer」と入力すると、出力として「er」が返されます。userIn[2] だけを要求しているのに、なぜ "r" も出力されるのですか?

また、「char userIn[256]」に代わる、汚れの少ない代替手段はありますか? 私の見方では、256 の制限は、ユーザーが入力できる内容を事前に決定します。これは悪いことです。しかし、userInが所定のサイズにならないようにする方法がわかりません。

char userIn[256];
printf("Type the message to be encoded: ");
scanf("%s", &userIn);
printf("\n");;
printf("This was typed: %s\n", &userIn[2]);
4

3 に答える 3

5

あなたは求めていませんuserIn[2]。で始まる文字列を求めています&userIn[2]。フォーマット指定子%sは「文字列」を意味します。で始まる文字列&userIn[2]は確かに"er"です。これが出力として表示されるものです。

単一の文字を印刷する場合は、代わりに%c書式指定子を使用して渡すことができますuserIn[2]&userIn[2]

printf("%c\n", userIn[2]);

または、 を使用することもできます%sが、この場合、次のように、精度指定子を使用して出力する文字列の長さを明示的に制限する必要があります。

printf("%.1s\n", &userIn[2]);

上記の意味: 文字列を出力しますが、1 文字以上は出力しません。

PS コメントに記載されているように、あなたのscanf呼び出しは正しくありません。または のいずれscanf("%s", userIn)scanf("%s", &userIn[0])である必要がありますが、現在のものではありません。これで通常は「機能」しますが、ポインターの型はまだ正しくありません。多くのコンパイラは、これについて警告を発します。

于 2013-09-25T15:59:42.560 に答える
3

文字列を出力し、それに 3 番目の文字のアドレスを与えるように printf に指示しています。もしあなたがそうするなら

printf("This was typed: %c\n", userIn[2]);

代わりに、'e' のみを表示します。

于 2013-09-25T16:00:27.087 に答える
0

これは、「%c」ではなく「%s」を使用しているためだと思います。%s は NULL で終わる文字列を意味し、%c は単一の文字です。あなたのケースで %s を使用すると、null 終了文字が見つかるまで、指定した配列位置から始まる残りの文字列であるため、「er」が出力されます。

交換

printf("This was typed: %s\n", &userIn[2]);

printf("This was typed: %c\n", &userIn[2]);
于 2013-09-25T16:03:34.540 に答える