入出力
1.printf()
1.1 引用条件
printf() 関数を使用する前に、ヘッダー ファイル <stdio.h> を導入する必要があります。
1.2 改行について
printf() は印刷時に自動的に行を折り返さないため、出力テキストの最後に改行文字であるエスケープ文字 \n を追加する必要があります。そうしないと、変調の出力結果が見にくくなります。
テキストの途中に \n を追加して改行することもできます。
int main() {
printf("我要换行!");
printf("换了又好像没换。。。");
printf("我要换行!\n");
printf("真的换了!\n");
printf("还能在\n文本\n里面换!");
return 0;
}
1.3 プレースホルダー printf の f は
フォーマットを意味し、printf() 関数が出力をフォーマットできることを意味します。
プレースホルダーの最初の文字はパーセント記号 % で、2 番目の文字はプレースホルダーの種類を示します。
異なるプレースホルダーは異なるデータ型を表します。プレースホルダーの位置は他の値に置き換えることができます。少し抽象的です。例を直接示しましょう。
//占位符
int main() {
printf("字符:%c\n", '1');//占位符%c表示 这里代入的数必须为字符
printf("整数:%d\n", 1);//占位符%d表示 这里代入的数必须为整数
printf("字符串:%s\n", "1");//占位符%s表示 这里代入的数必须为字符串
printf("浮点数:%f\n", 1.0);//占位符%f表示 这里代入的数必须为浮点数
}
return 0;
}
対応するプレースホルダのデータ型に応じて値が置換されていない場合は、警告+エラーが報告され、実行が成功しても出力値にはさまざまなエラー(文字化け、結果が表示されないなど)が発生します。
テキスト内に複数のプレースホルダーを含めることができます
int main() {
printf("今天考试考了%d分,花了%.2f元买了包烟,路上遇见老%c,他说:“%s", 0,9.99,'A',"抽你个棒棒锤!");
}
よく使用されるプレースホルダーとその意味
1.4 幅の制限
printf() により、プレースホルダーの最小幅を制限できます
%5d は、このプレースホルダーの幅が少なくとも 5 文字であることを意味します。5 桁未満の場合は、対応する値の前にスペースが追加されます。
出力値はデフォルトでは右揃えになっており、出力内容の左側にスペースが入ります。左揃えに
変更したい場合は、出力内容の右側にスペースが入ります。コンテンツでは、プレースホルダー内の % の後に - 記号を挿入できます。
int main()
{
//整数
printf("%5d\n", 123); // 输出为 " 123"
printf("%-5d\n", 123); // 输出为 "123 "
printf("111111"); //开头和3会有两个空格差
return 0;
}
小数点以下の制限幅は同じですが、デフォルトでは小数点以下 6 桁が保持されるため、次の場合、1.0 のデフォルト出力は 1.000000 で、すでに 8 桁を占めており、前に 2 桁が追加されます。
//小数
printf("%10f\n", 1.0); // 输出为" 1.000000"
printf("%-10f", 1.0); // 输出为"1.000000 "
printf("111111");
1.5 小数点以下の桁数を制限する
int main() {
printf("绩点:%.2f\n", 3.555555);
return 0;
}
%f プレースホルダは、デフォルトで 6 を小数点として保持します。%.2f と同様の形式を使用して、小数点以下の桁数を制限できます。
1.6 幅の制限と小数点以下の桁数の制限は併用可能
int main() {
printf("%6.2f\n", 3.555);
return 0;
}
幅は少なくとも 6 で、小数点の後に小数点以下 2 桁があります [][] 3.56 の前にスペースが 2 つあります
1.7 幅と小数点以下の桁を置き換えるには * を使用します
int main() {
printf("%*.*f\n", 6,3,3.555);
return 0;
}
printf(“%*.*f\n”, 6, 3, 3.555) と printf(“%6.2f\n”, 3.555) の結果は同じです
1.8 プレースホルダ %s は文字の一部を出力します
%s は、置換される値が文字列である必要があることを示します。デフォルトでは、すべてが出力されます。文字列の一部のみを変更する必要がある場合は、次のコマンドを使用できます。%。[MS出力長を指定します。[m]は出力する長さを示す数値です。
//%s 输出部分字符
int main() {
printf("%.5s", "123456789");//12345
return 0;
}
2.scanf()
2.1 基本的な使い方
int main()
{
int score = 0;
printf("请输入成绩:");
//输入一个值
scanf("%d", &score);
//输出
printf("%d", score);
return 0;
}
その結果、問題が発生し、エラーが報告されました (エラー コード C4996)。
理由: vs の IDE でコンパイルする場合、scanf は安全ではないとみなされるため、代わりに scanf_s が使用されます。
注: ただし、scanf は C 言語の標準ライブラリでまだ使用されています。他のコンパイラで scanf_s を使用しても意味がありません。
解決
解決策 1
: vs の scanf を scanf_s に置き換えます。
オプション 2 (推奨)
現在のプロジェクトの最初の行にコードを追加します (最初の行に追加する必要があります)
#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS
唯一の解決策:
Visual Studio IDE\Common7\IDE\VC\VCProjectItems ディレクトリに newc++file.cpp ファイルが作成されます。このファイルは、
新しい .c または .cpp ファイルが作成されるたびにコピーされます。
このファイルをこのファイル内で見つけます。最初の行に #define _CRT_SECURE_NO_WARNINGS 1 を追加します。新しい .c または .cpp ファイルを作成するたびに、このコード行 #define _CRT_SECURE_NO_WARNINGS 1 がデフォルトで組み込まれます。
オプション 3
: コード
#pragma warning(disable:4996)を追加する
と、報告されるエラー コードは C4996 になります。
複数の変数を同時に入力できますが、各変数とプレースホルダーの対応する順序が一貫している必要があり、プレースホルダーで定義されるデータ型も一貫している必要があります。
int main()
{
int a = 0;
int b = 0;
float f1 = 0;
float f2 = 0;
scanf("%d %d %f %f", &a,&b,&f1,&f2);
//scanf("%d%d%f%f", &a,&b,&f1,&f2);//和上行代码相等,执行调式时输出依然要使用空格来隔开
//scanf() 处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等
printf("%d %d %f %f", a,b,f1,f2);
return 0;
}
1 つ以上のスペースは、scanf() のデータ解釈機能には影響しません。
また、Enter キーやスペースバーなどを使用して入力部分を複数の段落に分割することもできますが、解釈には影響しません。
値を入力した後に Enter キーを押すたびに、scanf() は Enter キーが押された順序でプレースホルダーの解釈を開始するためです。
2.2 scanf の戻り値
scanf() の戻り値は、読み込みに成功した変数の数を示す整数です。
読み取れなかった場合、または一致に失敗した場合
は0 が返されます。
int main()
{
int a = 0;
int b = 0;
float f1 = 0;
float f2 = 0;
int sum = scanf("%d %d %f %f", &a, &b, &f1, &f2);
printf("%d", sum);
return 0;
}
すべての入力は正しいです
正しい単語を 2 つ入力し、直接 ctrl+z (3 つ) を押して終了し、早期に終了します。
数値が 1 つも失われていない場合は、ctrl+z を押して終了し、-1 (EOF) を出力します。
2.3 プレースホルダー
%c: 文字。
%d: 整数。
%f: float 型の浮動小数点数。
%lf: double 型の浮動小数点数。
%Lf:long double 型の浮動小数点数。
%s: 文字列。
%[]: 角括弧内に一致する文字のセットを指定します (%[0-9] など)。セットに含まれない文字が見つかった場合、一致は停止します。
%c を除き、先頭の空白文字は自動的に無視されます。
%c は空白文字を無視せず、文字がスペースであるかどうかに関係なく、常に現在の最初の文字を返します。
int main()
{
char ch = 0;
scanf("%c",&ch);
printf("%c",ch);
printf("xxx");//作为参照物
return 0;
}
ここに [space]a と入力し、
[space]xxx を出力します
説明: 入力プレースホルダーが文字の場合、常に最初の文字のみが読み取られ、スペースは無視されません。
プレースホルダー %s に関して、scanf() で読み取るためのルールは次のとおりです。最初の非空白文字の前から、最初に見つかった空白文字 (つまり、スペース、改行、タブなど) までを読み取ります。
%s には空白文字が含まれないため、スペースを含む可能性のある文字列の読み取りには適していません。
注: scanf() 関数は、文字列を文字配列に読み取るとき、その文字列が配列の長さを超えているかどうかを検出しません。
したがって、%s プレースホルダーを使用する場合は、読み取り文字列の最大長を指定することをお勧めします。それは %[ms]s です, m は読み込む文字列の最大長を示す整数で、それを超える文字列は破棄されます。
//字符串%s占位符
int main()
{
char arr[8];//最大只能输7个字符 末尾还有一个转义字符\0
scanf("%3s", &arr);//输入限制在3个字符以内
printf("%s", arr);
return 0;
}
2.4 代入無視文字
プレースホルダーのパーセント記号の後に * が追加されている限り、プレースホルダーは値を返さず、解析後に破棄されます。
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d%*c%d%*c%d", &year, &month, &day);
printf("%d-%d-%d", year, month, day);
return 0;
}
途中に挟まれた2つの%c文字のプレースホルダは、%の後に*が付加されているため、読み込んで解析した後に破棄されるため、入力時に区切られた2文字が何であっても結果には影響しません
。