[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] = '\0'; //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] = '\0'; printf ("Your name is: %s and you are %d years oldn",name, age); return 0; }
「\0’ ý nghĩa là gì vậỵ bạn.
Là ký tự kết thúc chuỗi đó bạn
親愛なる友人, cho mình hỏi tình huống này với. Nếu file đầu vào của mình trên một dòng có các giá trị và cách nhau một khoảng trắng. Ví dụ như: 2 3 4 6 trên cùng một dòng và mình muốn đọc các giá trị 2, 3, 4, 6 trên và ghi vào một mảng thì làm thế nào để loại bỏ được khoảng trắng kia hả bạn
Cảm ơn bạn nhiều
Bạn cứ dùng fscanf là được mà.
私の友人, tại sao câu lệnh if (fgetsの (名前,256,標準入力) != NULL); lại có tác dụng xóa bộ nhớ đệm
Vì nó đọc chuỗi trong bộ nhớ đệm mà 🙂
sao e ghi vào ‘\0’ máy báo lỗ ạ
A được rồi a ơi
loi gi the e.
anh ơi sao em chạy chương trình trên của anh nó thông báo như này
1.℃: 関数「メイン」は、:
1.℃:13:28: 警告: その型の定数が長すぎる文字 [デフォルトで有効になって]
名前[strlen関数(名前)-1] =「\0';
^
1.℃:13:5: 警告: 暗黙の定数変換でオーバーフロー [-Woverflow]
名前[strlen関数(名前)-1] =「\0';
^
それだけで単なる警告です. いいんですよ.
どのようにFGETは彼に尋ねたよりも長くget_s?
それだけで取得get_s, 何があるため、各バージョンだけではありません. FGETは、ファイルから読み込まれるNHE. http://en.cppreference.com/w/c/io/gets
シンタックスのfgetsで ( タンク *, int型 , ファイル *) , それは、文字のint型に限定されています. 常に読んでください、より多くの文字列を入力する必要があります.
例: 1234彼ら, 大きなint型を置くことでなければなりません 7. もし 2 または 3 その後、読み取りがありません.
先生はint型に数値を入力し、まだ右実行する方法を知りません。…!!
ちょうど入ります 255 ある. これは、退職に含めなければならない関数の引数を定義し.
イブニング..!!
^^
それが報告された理由を私に尋ねてみましょう
名前[strlen関数(名前)-1] =「\0';; た
その型の定数が長すぎる文字
‘ 0という文字が表示されます’ 無アポストロフィその本当でした?
ウェイター, 私のコードは削除されました 1 以下のファイルの行, ループは、関数fgetsを使用して、私はそれを得ることはありませんしながら、, 実行するためのヘルプの子供たちへの欲求!
https://drive.google.com/open?id=1BUkChJCUK6k9Wiq7Pq0e4amzAHW3vzs_
何を理解していません, 任意の部分を理解していません, コマンド. 誰がどのように説明する方法を知っている依頼? リンクアクセスできないNHE.
ああ, あなたが理解してほしいです, 私は、whileループの繰り返しの条件を理解していません, どのように機能の行と列を閲覧することができます関数fgets?
https://drive.google.com/open?id=1PjJ1nMjL6tctCATTVlN0Ksd29oWLtQVf
関数fgetsが読み込まれ 1 チェーン (ここのように見ることができます 1 現在).
同時に( fgetsの(STR, 199, 終了) != NULL) 平均しばらく、その後読み続けます.
つまり、fgetは文字 ‘ nまで読み取ります’ その後、ループバックもう一度先生?
eは、視覚過ごし 2017, getlineのコマンドは、追加するすべての障害のある電子のscanf printfのコマンドを使用して、未知のdinh.Vaでは見られない過ごすことになります ” _s ” その背後ではないエラー, ここで行うための電子, おそらくない障害のあるソフトウェアによる.
コNHE. それのVSので、. ここでのDev-Cを使用してコード++, VSは、構造が少し異なって命令することができます。.
gets_sを使用している場合、この構文はあなたのために機能します
gets_s(,
);5 投稿の星, エラーを修正しました. どうもありがとう