入力を読み取るには、fgets関数を使用することをお勧めします。これは、 の優れた安全な代替手段scanf
です。
まず、次のようにバッファを宣言しましょう。
char user_input[20];
次に、次の方法でコマンドラインからユーザー入力を取得できます。
fgets(user_input, 20, stdin);
これにより、最大 20 文字が標準入力から文字列に格納され、null で終了することが保証されます。入力を前に宣言した配列のサイズに制限したという事実により、バッファー オーバーランの可能性がなくなります。
次に、 strlenを使用して文字列に入力された厄介な改行をクリアしましょう。
user_input[strlen(user_input) -1] = '\0';
Asは null ターミネータまでstrlen
の文字列のサイズを返しますが、それがなければ、その位置に改行文字 ( ) があることを確認できます。文字列がそこで終わるように、null-terminator( ) に置き換えます。\n
\0
最後に、 printfを使用して印刷しましょう。
printf("The user has entered '%s'\n", user_input);
使用するには、次のヘッダーを宣言する必要がfgets
ありprintf
ます。
#include <stdio.h>
別のヘッダーが必要です。strlen
つまり、次のとおりです。
#include <string.h>
ジョブ完了。
PS質問に追加したコードに対処できる場合。
main
は通常、何らかの種類の値を返すことも必要とするのでint main
はなく、として宣言されます。小さなアプリの場合、通常、閉じ中括弧の直前に配置されます。この戻り値は、プログラムが正常に実行されたかどうかを OS に示すために使用されます (0 はすべてが正常であることを意味し、ゼロ以外は問題があったことを意味します)。void main
main
return 0;
文字列を null で終了していません。つまり、注意深いループ以外の方法で読み取ると、問題が発生します。
ユーザーからの入力を2回getchar
受け取りますscanf
。
コードを使用することを主張する場合は、少し変更しました。
#include<stdio.h>
int main()
{
char a[10];
int i=0;
while( (a[i++]=getchar()) != '\n' && i < 10) /* take input from user until it's a newline or equal to 10 */
;
a[i] = '\0'; /* null-terminate the string */
i = 0;
while(a[i] != '\0') /* print until we've hit \0 */
printf("%c",a[i++]);
return 0;
}
これで動作するはずです。