web-dev-qa-db-ja.com

getsとscanfの違いは何ですか?

コードが

scanf("%s\n",message)  

gets(message)

違いは何ですか?どちらもメッセージへの入力を受け取るようです。

10
Shihe Zhang

基本的な違い[特定のシナリオに関連して]、

  • scanf()は、whitespacenewline、またはEOFに遭遇すると入力の取得を終了します

  • gets()は、空白を入力文字列の一部とみなし、newlineまたはEOFに遭遇すると入力を終了します。

ただし、バッファオーバーフローエラーを回避し、セキュリティリスクを回避するには、fgets()を使用する方が安全です。

17
Sourav Ghosh

gets-stdinから文字を読み取り、文字列として保存します。

scanf-stdinからデータを読み取り、scanfステートメントで指定された形式に従ってデータを保存します%d%f%sなど.

4
Shwetha

いくつかあります。 1つは、gets()は文字列データのみを取得することです。もう1つは、gets()が一度に1つの変数のみを取得することです。一方、scanf()ははるかに柔軟なツールです。異なるデータ型の複数のアイテムを読み取ることができます。

選んだ特定の例では、大きな違いはありません。

4
Dinesh

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.
3
Anbu.Sankar

scanfの場合、getsとは異なり、上記の形式が必要です。したがって、getsには、文字、文字列、数字、スペースを入力します。

scanfの場合、空白に遭遇するとすぐに入力が終了します。

しかし、あなたの例では「%s」を使用しているので、gets()scanf()も、文字列は送信する文字を保持するのに十分な長さの配列への有効なポインタではありません。したがって、バッファオーバーフローが簡単に発生する可能性があります。

ヒント:fgets()を使用しますが、それはすべてユースケースに依存します

2
argentum47

gets()は安全ではありません。例:char str [1]; gets(str)長さを超えて入力すると、SIGSEGVで終了します。 getsのみを使用できる場合は、mallocをベース変数として使用します。

0

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関数には基本的に違いはありません。これは実装のトリッキーな方法です。

0
Anirban Ghosh