MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
C言語の基礎 - 標準入力から安全に文字列を取得するのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
C言語の基礎 - 標準入力から安全に文字列を取得する
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 指定サイズ内で1行を受け取る == 次のように、文字列の格納領域が256[byte]用意されているとする。<br> <syntaxhighlight lang="c"> char buffer[256] = {'\0'}; </syntaxhighlight> <br> <code>scanf</code>関数と<code>fgets</code>関数の主な違いを纏めると以下のようになる。<br> NULL文字<code>\0</code>が終端に自動付与されることを考慮すると、ユーザが実質入力できるのは255[byte]までである。<br> <br> <u>※注意</u><br> <u><code>scanf</code>関数は<code>scanf("%s", buffer);</code>のようにサイズを指定せずに使用できるが、バッファオーバーランの危険性があるので避けること。</u><br> <center> {| class="wikitable" | style="background-color:#fefefe;" |- ! style="background-color:#66CCFF;" | 説明 ! style="background-color:#66CCFF;" | scanf関数 ! style="background-color:#66CCFF;" | fgets関数 |- | 基本的な使用法 || scanf("%255s", buffer) || fgets(buffer, 256, stdin) |- | 改行の扱い || 改行文字の直前まで読み込む || 改行文字も一緒に読み込む |- | 成功時の戻り値 || 読み込んだパラメータ数 || buffer |- | 失敗時の戻り値 || 0<br>または<br>EOF (-1) || NULL |- | 入力文字の取得 || できる || できない |} </center> <br><br> == scanf関数の利用 == scanf関数は多機能であり、フォーマットを記述することで動作のカスタマイズが可能である。<br> <br> 以下に、<code>scanf</code>関数のフォーマットを記載する。<br> * %sは全ての空白文字(半角スペースも含む)を無視するため、%sの代わりに%[^\n]と指定することで、無視する対象を改行だけに限定できる。<br>例えば、<code>%255[^\n]</code>は、改行以外の文字列を1〜255文字読み込むことを意味する。 * <code>%</code>の代わりに<code>%*</code>を使用すると、その部分を読み飛ばすことができる。<br>例えば、256文字以上入力する場合、最初の255文字までを受け取り、残りを捨てる場合は、<code>%255[^\n]%*[^\n]</code>と記述する。 * 再度<code>scanf</code>関数を使用する場合に備えて、残った改行は<code>%*c</code>で読み飛ばす。<br>これにより、保持されていた入力データは全て処理されたことになる。<br>ただし、次に読み取るものが<code>%d</code>等の数値である場合には、これをしなくても特に影響はない。 <br> また、<code>scanf</code>関数は正常に読み取って変数に格納できたパラメータの数を返すので、これを成功したかどうかの判定に用いることができる。<br> <code>%255[^\n]%*[^\n]</code>を実行した場合の戻り値は、以下のようになる。<br> * 1文字以上読み取れたときは 1 * 改行だけが入力されたときは 0 * 最初から [Ctrl] + [D](Linux)または[Ctrl] + [Z](Windows)でEOFが入力された時は、EOF(EOF定数の値 : -1) * 失敗した場合は、<code>return 1;</code>としてプログラムを異常終了扱いにするとよい。 <br> 以下の例では、必ず1文字以上入力させている。<br> <source lang="c"> #include <stdio.h> int main() { char buffer[256] = {'\0'}; printf("Input: "); if (scanf("%255[^\n]%*[^\n]", buffer) != 1) { return 1; } scanf("%*c"); printf("Output: %s\n", buffer); return 0; } </source> <br> 以下の例では、改行だけの入力を認めている。<br> <source lang="c"> #include <stdio.h> int main() { char buffer[256] = {'\0'}; printf("Input: "); if (scanf("%255[^\n]%*[^\n]", buffer) == EOF) { return 1; } scanf("%*c"); printf("Output: %s\n", buffer); return 0; } </source> <br> 以下の例では、入力された文字数も取得している。(%255[^\n]の後ろは、unsigned / intの場合は%n、size_t / ssize_tの場合は%znを指定する)<br> (%n系は符号付き整数で取得するように定義されているが、負の値が出現する可能性がゼロなので、符号無し整数でも問題ない)<br> <source lang="c"> #include <stdio.h> int main(void) { char buffer[256] = {'\0'}; size_t length; printf("Input: "); if (scanf("%255[^\n]%zn%*[^\n]", buffer, &length) != 1) { return 1; } scanf("%*c"); printf("Output: %s\n", buffer); printf("Length: %zu\n", length); return 0; } </source> <br><br> == fgets関数の利用 == fgets関数は、改行も1行に含めて一緒に取得する。<br> 削除する場合は、各自でコードを記述しなければならない。<br>strlen関数を使用するなどして、文字列長を求めることも必要である。<br> <br> また、戻り値は以下のようになる。<br> * 1文字以上読み取れた場合は、buffer(改行だけでも1文字以上という扱いになる) * 最初からCtrl+D(Windowsの場合はCtrl+Z)でEOFが入力された場合は、NULL * 失敗した場合は、そのままreturn 1;としてプログラムを異常終了扱いにさせるとよい。 <br> 以下の例では、必ず1文字以上入力させて改行を削除している。<br> <source lang="c"> #include <stdio.h> #include <string.h> int main(void) { char buffer[256] = {'\0'}; size_t length; printf("Input: "); if (fgets(buffer, 256, stdin) == NULL || buffer[0] == '\n') { return 1; } length = strlen(buffer); if (buffer[length - 1] == '\n') { buffer[--length] = '\0'; } printf("Output: %s\n", buffer); printf("Length: %zu\n", length); return 0; } </source> <br> 以下の例では、改行だけの入力を認めて改行を削除している。<br> <source lang="c"> #include <stdio.h> #include <string.h> int main(void) { char buffer[256]; size_t length; printf("Input: "); if (fgets(buffer, 256, stdin) == NULL) { return 1; } length = strlen(buffer); if (length > 0 && buffer[length - 1] == '\n') { buffer[--length] = '\0'; } printf("Output: %s\n", buffer); printf("Length: %zu\n", length); return 0; } </source> <br> 以下の例では、改行だけの入力を認めて改行を削除している。<br> <source lang="c"> #include <stdio.h> int main(void) { char buffer[256]; printf("Input: "); if (fgets(buffer, 256, stdin) == NULL) { return 1; } printf("Output: %s\n", buffer); return 0; } </source> <br><br> __FORCETOC__ [[カテゴリ:C]]
C言語の基礎 - 標準入力から安全に文字列を取得する
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse