[C / C++]入手する() とFGET() Cで/ C – ユーザーが取得したときに警告() – 使用が取得したときに警告()

通常、我々は、関数scanf関数を入力するために変数を使用(), この関数は、入力するために使用されている 1 文字列が、空白の看板に会った (スペース, 入力する,…) その後はもう読んでいないと、その文字列から切断し、, 例エントリ “グエン·ヴァン·代理店” その後、我々は唯一の取得 “グエン”.
ここでの修正は、我々は、関数が取得する使用していることである() 文字列を入力する. 😀 Khi đó ta sẽ nhận được chuỗi nguyên vẹn.
しかしトリッキーなことは、もしバッファであり、生まれた (標準入力ファイル) 文字が読まれていないものが含まれ (scanfのことでVDのブランク() まだファイル標準入力を読み取ることができませんでした) それを取得() 手紙を受け取る権利と文字列を入力しませんでした (浮動コマンドの現象). また、使用前に私たちの治療を取得() 添加 1 夜そのfflushはを削除するコマンドを標準入力(標準入力). その後、我々は文字列を入力することができました 1 安定した

 
#include <stdio.h>
  
int main()
{
    int age;
    char name [256];
    printf ("Insert your age: ");
    scanf("%d",&age);
    fflush(stdin);
    printf ("Insert your name: ");
    gets (name);
    printf ("Your name is: %s and you are %d years oldn",name, age);
    return 0;
}

しかし、問題は再び我々は表示されません窓で発生する 1 上のコードで警告, Linux上でコードがエラーなしでもなく起こるでベルベット 2 問題. まず、マシンは警告をコンパイルします ” 警告: 「char *を取得(CHAR *)「廃止されました (は/usr/include/stdio.hで宣言:638) [-Wdeprecated-宣言] ” そして第二には、コマンドにfflushです(標準入力) 動作しません, 私が注文をバック漂流.

まず、このアラートを扱う行く. 本の中で “CおよびCのためのセキュア·プログラミングクックブック ” 章の通路があります 3.1 と言った: 取得します() この関数はCの古いライブラリに位置しています. この関数は、チェーンが、非常に快適に入力するために使用されるが、入力データのバッファサイズをチェックされていない非常に危険な点がある. 全体のシステムクラッシュした場合の入力が宣言または処理を超えた場合、つまり、プログラムがクラッシュまたは悪化を行います. 特にLinux上, メモリ管理は非常に密接に (より多くの窓 !) そう警告が完全に正確である, 全く新しい警告には問題がありません !
は、Windowsでプログラムをコンパイルして試すことができます. ほとんどの場合 (多くの異なるコンパイラを使用) 警告ません. しかし、他のLinux上, それは、システムの安定性を保証する唯一の機構であるので, システムは流れ弾プログラマに食べられていないことを確認してください , そうでなければ、GCCコンパイラは無料ですが、非常に近代的ですが、, それは常に固定し、最新の標準C / C のアップデート
(解説 drnoxxx ddth.comで)
だから、それを処理する方法? 私達のための一つの解決策は、fgetsのを使用することです() 入力する. fgetsの() 私たちは、ファイルからインポートし、チェーンを入力するときにサイズを指定することができる機能です. ファイルをインポートするために使用されるコードのイラスト

#include <stdio.h>

int main()
{
	FILE * pFile;
	char mystring [100];
	pFile = fopen ("myfile.txt" , "r");
	if (pFile == NULL) perror ("Error opening file");
	else
	{
		if ( fgets (mystring , 100 , pFile) != NULL ) //nhap chuoi toi da 100 phan tu tu file
		puts (mystring);
		fclose (pFile);
   }
   return 0;
}

しかし、あなたはfgetsのdunuを使用する場合() 星は、キーボードから入力? 単純です, あなたは上記のように、ファイルを宣言する必要はありません, 単に標準入力上のファイルを置き換えることによって、大丈夫です !

fgets (mystring , 100 , stdin);

最初の問題を解決 2 fflushはを使用しない場合のバッファが削除されます(標準入力) ? 答えは、単に標準入力からすべてのスペースを読んで簡単です 1 特定の変数と彼の仕事を続けたが大丈夫です.
fgetsのを使用する場合、別の問題が生じる() あなたは文字列を入力すると、入力したキーを押す必要があり、それは常にあなたの入力したキーチェーンを読み取りますが終了したら、キーボードから入力された, カーソルが自動的に改行されたとき, 私たちが書きたいとき、これは困難になる 2 xuau同じ 1 現在. 我々はNULLを追加し、別の手法を使用し、この問題を解決するバナナの最後の文字に割り当てられているコマンドを入力します。

string[strlen(string)-1] = '&#092;&#048;'; //chu ý khai báo string.h

ここでは、コード使用のfgetsです().

#include <stdio.h>
#include <string.h>
int main()
{
	int age;
	char name [256];
	printf ("Insert your age: ");
	scanf("%d",&age);
	if (fgets (name,256,stdin) != NULL); //xoa bo dem
	//fflush(stdin); //khong co tac dung xoa bo dem
	printf ("Insert your name: ");
	if (fgets (name,256,stdin) != NULL); //nhap ten
	name[strlen(name)-1] = '&#092;&#048;';
	printf ("Your name is: %s and you are %d years oldn",name, age);
	return 0;
}