2011-06-22 11 views
5

それは基本的な質問ですが、私は十分に混乱しているようです。fgetsは内部的にどのように機能しますか?

#include<stdio.h> 
int main() 
{ 
char a[100]; 
printf("Enter a string\n"); 
scanf("%s",a); 
} 

これは基本的には達成したいことです。 私は、文字列を入力した場合

James Bond 

が、私はそれを配列に格納することにしたいです。 しかし、問題は、James単語だけの間に空白スペースが存在するためです。 どうすればこの問題を解決できますか?私は(fgetsのを理解して下記の返信)した後

UPDATE
は、より良い選択です。私はfgetsの内部的な働きを知りたいのですが、scanfが同じことをすることができないスペースで文字列を格納できるのはなぜですか?

+3

'scanf'の代わりに' fgets'を使います。ほとんどいつも。 –

+0

@Chris Lutz私はfgetsがどのように動作するのか知りたいのですが、fgetsはscanfではなくスペースを受け入れることができますか? –

答えて

5

ためThe Open Group Base Specifications Issue 7を使用


が、これは何が必要ですか?

すべての実装は、入力ファイル(またはストリーム)をスキャンまたはEOF、またはmaxSizeパラメーターがヒットしました...

+0

まあまあ私が望んでいた男です。ありがとう。私はあなたがそれを得るために使用していたキーワードを知っているか教えてください。 –

+0

http://www.google.ro/search?q=fgets+source+code&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a – Quamis

0

sscanf()の代わりにgets(a)/ fgets(a、sizeof(a)、stdin)を使用する必要があります。

+0

私はfgetsの内部的な働きを知りたいのですが、scanfが同じことをすることができないスペースで文字列を格納できるのはなぜですか? –

+0

@登録ユーザーはhttp://www.cplusplus.com/reference/clibrary/cstdio/sscanf/をご覧ください。 sscanfの%sはwordを使用して動作します。 (空白が見つかるまで) – mattn

1

scanfは最初の空白文字まで読み取ります。

fgets(a, 100, STDIN);

それは、標準入力から100の文字(または最初の\ nの)まで読んで、それを格納します:解決策は、メモリが正しく私を提供する場合、あなたのインスタンスで、それはなるだろう、関数fgetsを使用することですa。

gets関数を使いやすくしても使用しないでください。

+0

@Lainlwakura fgetsはなぜfgetsが動作するのか知りたいのですが、fgetsはscanfではなくスペースを受け入れることができるのですが、なぜgets()を使わないのでしょうか? –

+1

fgets()の内部構造はわかりませんが、配列へのポインタしかないので、gets()を使うべきではありません。配列の大きさを知ることは全くなく、実際には非常に簡単にオーバーフローさせることができます。 gccのようなコンパイラの中には実際にgets()関数の使用について警告するものがあります – LainIwakura

0

fgets()をお試しください:

char a[100]; 
printf("Enter a string\n"); 
fgets(a, sizeof(a), STDIN); 

STDINcheck thisの詳細については。

+0

fgetsはどのように動作するのか、つまりfgetsが完全な文字列を空白でどのように格納できるかを知りたいと思います。 –

+0

@登録ユーザー:リンクを確認してください。 – Donotalo

+0

ファイルディスクリプタが0のstdinについてあなたのリンクを読んでいますが、fgetsがそれをどうやって取得できるかはわかりません。 –

1

通常、scanfは空白(スペース、タブ、改行など)で入力を分割します。

たとえば、入力" 5 42 -100"scanf("%d%d%d")で受け入れられます。これは、それぞれ%dが先頭の空白を取り除くためです。同じ動作が%sで発生します。

先頭の空白を無視のみ変換指定子である%%%[及び%c(及び、異なる理由のために、%n

char input[] = " hello world"; 
char buf[100]; 
sscanf(input, "%8c", buf); /* buf contains " hello w" */ 
sscanf(input, "%8[^o]", buf); /* buf contains " hell" */ 

が起こらないあるようfgets関数は、多くの文字を読み取り、巣の改行まで。私はオンラインドキュメント

関連する問題