C言語のscanfファミリー関数の使い方を教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私から学べます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
目次
【C言語】scanfファミリー関数
1 2 3 4 5 6 7 |
int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(const char *str, const char *format, ...); int vscanf(const char *format, va_list ap); int vfscanf(FILE *stream, const char *format, va_list ap); int vsscanf(const char *str, const char *format, va_list ap); |
scanfファミリー関数(scanf/fscanf/sscanf/vscanf/vsscanf/vfscanf関数)を紹介します.
scanfファミリー関数は,formatに従って入力を読み込みます.
この書式には「変換指定」(conversion specifications)を含めることができます.
変換指定があれば,その変換の結果はformatに続くポインタ引数が指す場所に格納されます.
それぞれのポインタ引数の型は,対応する変換指定が返す値に適合していなければなりません.
format中の変換指定の個数がポインタ引数の数より多かった場合の結果は未定義になります.
ポインタ引数の数が変換指定の個数よりも多かった場合,余分なポインタ引数の評価は行われますが,それ以外は行われず無視されます.
scanf関数は標準入力ストリームstdinからの入力を読み込みます.
fscanf関数はストリームポインタstreamからの入力を読み込みます.
sscanf関数は文字列ポインタstrで示された文字列からの入力を読み込みます.
vfscanf関数はvfprintf関数と同様に,ストリームポインタstreamからの入力をポインタの可変長引数リストを用いて読み込みます.
vscanf関数は,可変長引数のリストに基づき標準入力からの読み取りを行います.
vsscanf関数はそのリストに基づき文字列から読み取ります.
vscanf関数とvsscanf関数の関係は,vprintf関数とvsprintf関数の関係と同様です.
format文字列は,「命令」(directive)の列で構成されます(命令の詳細はこちら).
命令は入力文字の系列をどのように処理するかを指示するものです.
ある命令の処理が失敗すると,入力はそれ以上読み込まれず,scanf関数は返ります.
scanfファミリー関数の使い方
scanfファミリー関数の使い方は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define BUFSIZE 64 void do_vscanf(const char *format, ...) { va_list args; va_start(args, format); vscanf(format, args); va_end(args); } void do_vfscanf(FILE *stream, const char *format, ...) { va_list args; va_start(args, format); vfscanf(stream, format, args); va_end(args); } void do_vsscanf(const char *str, const char *format, ...) { va_list args; va_start(args, format); vsscanf(str, format, args); va_end(args); } int main(void) { char buf[BUFSIZE], buf2[BUFSIZE]; const char *str = "VA HELLO WORLD!\n"; printf("Please input a string: "); scanf("%s", buf); printf("buf = %s\n", buf); printf("Please input a string: "); fscanf(stdin, "%s", buf); printf("buf = %s\n", buf); sscanf("Hello World!\n", "%s%s", buf, buf2); printf("buf = %s\n", buf); printf("buf2 = %s\n", buf2); printf("Please input a string: "); do_vscanf("%s", buf); printf("buf = %s\n", buf); printf("Please input a string: "); do_vfscanf(stdin, "%s", buf); printf("buf = %s\n", buf); do_vsscanf(str, "%s", buf); printf("buf = %s\n", buf); return 0; } |
実行結果は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ gcc scanf.c $ a.out Please input a string: ab buf = ab Please input a string: cde buf = cde buf = Hello buf2 = World! Please input a string: fg buf = fg Please input a string: hij buf = hij buf = VA |
まとめ
C言語のscanfファミリー関数の使い方を紹介しました.
scanfファミリー関数は少しクセがあって使い方が難しいので,参考にして下さい.
printfファミリー関数を知りたいあなたはこちらからどうぞ.
scanf関数の自作「myscanf関数」を知りたいあなたはこちらからどうぞ.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!