コードが
scanf("%s\n",message)
対
gets(message)
違いは何ですか?どちらもメッセージへの入力を受け取るようです。
基本的な違い[特定のシナリオに関連して]、
scanf()
は、whitespace
、newline
、またはEOF
に遭遇すると入力の取得を終了します
gets()
は、空白を入力文字列の一部とみなし、newline
またはEOF
に遭遇すると入力を終了します。
ただし、バッファオーバーフローエラーを回避し、セキュリティリスクを回避するには、fgets()
を使用する方が安全です。
gets
-stdinから文字を読み取り、文字列として保存します。
scanf
-stdinからデータを読み取り、scanf
ステートメントで指定された形式に従ってデータを保存します%d
、%f
、%s
など.
いくつかあります。 1つは、gets()は文字列データのみを取得することです。もう1つは、gets()が一度に1つの変数のみを取得することです。一方、scanf()ははるかに柔軟なツールです。異なるデータ型の複数のアイテムを読み取ることができます。
選んだ特定の例では、大きな違いはありません。
gets:->
gets() reads a line from stdin into the buffer pointed to by s until
either a terminating newline or EOF, which it replaces with a null byte ('\0').
バグ:->
Never use gets(). Because it is impossible to tell without knowing the
data in advance how many characters gets() will read, and because
gets() will continue to store characters past the end of the buffer, it
is extremely dangerous to use. It has been used to break computer
security. Use fgets() instead.
scanf:->
The scanf() function reads input from the standard input stream stdin;
バグ
Some times scanf makes boundary problems when deals with array and
string concepts.
scanf
の場合、getsとは異なり、上記の形式が必要です。したがって、gets
には、文字、文字列、数字、スペースを入力します。
scanf
の場合、空白に遭遇するとすぐに入力が終了します。
しかし、あなたの例では「%s」を使用しているので、gets()
もscanf()
も、文字列は送信する文字を保持するのに十分な長さの配列への有効なポインタではありません。したがって、バッファオーバーフローが簡単に発生する可能性があります。
ヒント:fgets()
を使用しますが、それはすべてユースケースに依存します
gets()は安全ではありません。例:char str [1]; gets(str)長さを超えて入力すると、SIGSEGVで終了します。 getsのみを使用できる場合は、mallocをベース変数として使用します。
Scanfが空白をとらないという概念は完全に間違っています。コードのこの部分を使用する場合、ホワイトスペースも必要です:
#include<stdio.h>
int main()
{
char name[25];
printf("Enter your name :\n");
scanf("%[^\n]s",name);
printf("%s",name);
return 0;
}
新しい行の使用は入力の取得のみを停止します。つまり、Enterキーのみを押すと、入力を停止します。
したがって、scanf関数とgets関数には基本的に違いはありません。これは実装のトリッキーな方法です。