C言語学習(2)文字列と整形入出力

1. 文字列

文字列は 1 つ以上の文字のシーケンスです。例: 「ハローワールド」

二重引用符は文字列の一部ではありません。単一の文字を示すために一重引用符が使用されるのと同じように、文字列を囲んでいることをコンパイラに伝えるだけです。

文字列を示すために二重引用符が使用されている場合、デフォルトでは文字列の末尾に文字列の終わりを示す「\0」が表示されます。文字列を文字配列で表す場合、末尾に「\0」がなければ文字配列になります。

#include <stdio.h>

int main() {
    
    

    // 双引号定义的字符串
    char ar1[] = "abc";
    // 字符数组定义的字符串。末尾的\0表示字符串的结束。如果没有\0则表示一个字符数组
    char ar2[] = {
    
    'a', 'b', 'c', '\0'};
    printf("%s\n",ar1);
    printf("%s\n",ar2);

    return 0;
}

#include <stdio.h>
#include <string.h>

int main() {
    
    

    // 双引号定义的字符串
    char ar1[] = "abc";
    // 字符数组定义的字符串。末尾的\0表示字符串的结束。如果没有\0则表示一个字符数组
    char ar2[] = {
    
    'a', 'b', 'c'};
    printf("%s\n",ar1);
    printf("%s\n",ar2);
    // strlen函数为统计字符串的长度,统计\0之前的字符。
    printf("%llu\n", strlen(ar1));
    // 输出随机值,直到遇到\0才会输出
    printf("%llu\n", strlen(ar2));

    return 0;
}

1.1 char型配列とnull文字

C 言語には文字列を格納するための専用の変数型はなく、文字列は char 型の配列に格納されます。配列は連続した記憶単位で構成され、文字列内の文字は隣接する記憶単位に格納され、各記憶単位に文字が格納されます。

ここに画像の説明を挿入
配列の末尾の位置にある文字「\0」。null 文字 (ヌル文字) は、C 言語で文字列の終わりをマークするために使用されます。NULL 文字は数字の 0 ではなく、ASCII コード値が 0 である非印刷文字です。

C の文字列は NULL で終了する必要があります。これは、配列の記憶容量が、格納される文字列の文字数より少なくとも 1 多くなければならないことを意味します。アレイは、複数のストレージユニットの行として考えることができます。より正式には、配列は同じタイプのデータ要素の順序付けされたシーケンスです。

char str[40];

上記のプログラムは、40 個のストレージ ユニット (または要素) を含む配列を宣言しており、各ストレージ ユニットには char 型の値が格納されます。str の後ろの角括弧は、これが配列であることを示し、角括弧内の数字は配列内の要素の数を示し、char は各要素の型を示します。

1.2 文字列と文字

文字列定数 (" X " など) は文字定数(' X ')とは異なります。違いの 1 つは、文字定数が基本型 (char) であるのに対し、文字列は派生型 (char 配列) であることです。2 番目の違いは " X"は、実際には 'X' とヌル文字 \0 の 2 つの文字で構成されます。

2、入力

2.1 scanf()関数

C ライブラリにはいくつかの入力関数が含まれていますが、scanf() はさまざまな形式でデータを読み取ることができるため、最も一般的な関数です。scanf() は、printf() と同様に、フォーマット文字列と引数リストを受け取ります。scanf()関数は変数へのポインタを使用します(ポインタについては後で詳しく説明します)。

scanf() を使用するための 2 つのルール:

1、如果用scanf()读取基本变量类型的值,在变量名前加上一个 “&”。
2、如果使用scanf()把字符串读入字符数组中,不要使用 “&”。

2.2 2 つの用途

1、scanf("输入控制符",输入参数);
作用:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中。
#include <stdio.h>

int main() {
    
    

	int num;

	printf("Please enter a number:\n");
	scanf_s("%d", &num);
	printf("输入的数字为:%d", num);

	return 0;

}
2、scanf("非输入控制符 输入控制符",输入参数);
作用:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中,非输入控制符必须完全输入。
#include <stdio.h>

int main() {
    
    

	int num;

	printf("Please enter a number:\n");
	// ABC为非输入控制符,在进行输入时也必须加上ABC
	scanf_s("ABC%d", &num);
	printf("输入的数字为:%d", num);

	return 0;

}

3. 出力

3.1 printf()

printf() 関数にデータの印刷を要求する命令は、印刷するデータの種類と一致する必要があります。たとえば、%d は整数の出力に使用され、%c は文字の出力に使用されます。これらのシンボルは変換仕様と呼ばれ、データを表示可能な形式に変換する方法を指定します。

3.1.1 printf の 4 つの使用法

1、printf("字符串")
#include <stdio.h>

int main() {
    
    

	// 输出字符串
	printf("Hello world");

	return 0;
}
2、printf("输出控制符",输出参数)
#include <stdio.h>

int main() {
    
    

	int num = 123;
	// 输出变量的值
	printf("%d",num);

	return 0;
}
3、printf("输出控制符1 输出控制符2 ...",输出参数1,输出参数2...)。输出控制符和输出参数必须对应。
#include <stdio.h>

int main() {
    
    

	int num = 123;
	char ch = 'A';
	// 输出变量的值
	printf("%d %c",num, ch);

	return 0;
}
4、printf("输出控制符 非输出控制符",输出参数)
#include <stdio.h>

int main() {
    
    

	int num = 123;
	char ch = 'A';
	// is char为非输出控制符
	printf("%d %c is char",num, ch);

	return 0;
}

3.1.2 共通出力制御文字

変換命令 出力
%a 浮動小数点、16 進数、および p 表記法 (C99/C11)
%A 浮動小数点、16 進数、および p 表記法 (C99/C11)
%c 単一の文字
%d 符号付き 10 進整数
%e 浮動小数点数、e 表記
%E 浮動小数点数、e 表記
%f 浮動小数点数、10進数表記
%g 値に応じて、%f または %e が自動的に選択されます。%e 形式は、指数が -4 未満、または精度以上の場合に使用されます。
%G 値に応じて、%F または %E が自動的に選択されます。%E 形式は、指数が -4 未満、または精度以上の場合に使用されます。
%私 符号付き 10 進整数 (%d と同じ)
%o 符号なし 8 進整数
%p ポインタ
%s
%u 符号なし 10 進整数
%バツ 符号なし 16 進整数、16 進数の 0f を使用
%バツ 符号なし 16 進整数、16 進数の 0F を使用
%% パーセント記号を印刷する

3.1.3 printf()の変換仕様修飾子

% と変換文字の間に修飾子を挿入して、基本的な変換仕様を変更します。次の 2 つの表は、修飾子として使用できる有効な文字を示しています。複数の文字を挿入する場合、書き込み順序はテーブル printf() 内の修飾子の順序と同じである必要があります。すべての組み合わせが可能なわけではありません。表中の一部の文字は C99 で新たに追加されたものであり、コンパイラが C99 をサポートしていない場合、表内のすべての項目をサポートしていない可能性があります。

printf() の修飾子

修飾子 意味
マーク printf() フラグは 5 つのフラグ (-、+、スペース、#、および 0) を記述し、フラグを使用しないことも、複数のフラグを使用することもできます。例: 「%-10d」
番号 最小フィールド幅。フィールドが印刷する数値または文字列を収容できない場合、システムはより広いフィールドを使用します。例: "%4d"
。 番号 精度。%e、%E、%f 変換の場合、小数点の右側の桁数を示します。%g および %G 変換の場合、有効数字の最大数。%s 変換の場合、印刷される最大文字数を示します。整数変換の場合、数値を出力する最小桁数。必要に応じて、先頭に 0 を使用してこの桁数に達します。. を使用すると、後に 0 が続くことを意味するため、%.f と %.0f は同じになります。例: "%5.2f" は、フィールド幅 5 文字、小数点以下 2 桁の浮動小数点数を出力します。
h 整数変換仕様と一緒に使用して、short int 型または unsinged short int 型の値を表します。例: "%hu"、"%6.4hd"
ふーん 整数変換仕様と一緒に使用して、singed char または unsinged char 型の値を表します。例: "%hhu"、"%6.4hhd"
j stdint.h で定義されているように、整数変換仕様とともに使用して、intmax_t または uintmax_t 型の値を表します。例: "%jd"、"%8jx"
整数変換仕様とともに使用して、long int 型または unsinged long int 型の値を表します。例: "%ld"、"%8lu"
ll 整数変換仕様とともに使用して、long long int 型または unsinged long long int 型の値を示します (C99)。例: "%lld"、"%6llu"
L 浮動小数点変換仕様と一緒に使用して、long double 型の値を表します。例: "%Ld"、"%10.4Le"
t 整数変換仕様とともに使用され、ptrdiff_t 型の値を表します。ptrdiff_t は、2 つのポインターの差の型です (C99)。例: "%td"、"%l2ti"
z size_t 型の値を表すために整数変換仕様と一緒に使用されます。size_t は、sizeof (C99) によって返される型です。例: "%zd"、"%l2zd"

printf() のトークン

修飾子 意味
- 印刷する項目は左詰めで配置されます。つまり、項目はフィールドの左から印刷されます。例: 「%-10s」
+ 符号付き値では、値が正の場合は値の前にプラス記号が表示され、負の場合は値の前にマイナス記号が表示されます。例: 「%+6.2f」
符号付き値の場合、値が正の場合は値の前に先頭のスペース (文字なし) が表示され、負の場合は値の前にマイナス記号 + 記号がスペースを重ねて表示されます。例: "%6.2f"
# 結果を別の形式に変換します。%o 形式の場合は 0 で始まり、%x または %X 形式の場合は 0x または 0X で始まります。すべての浮動小数点数形式の場合、# を指定すると、次の場合でも小数点文字が印刷されます。その後ろに数字はありません。%g および %G 形式の場合、# により末尾の 0 が結果から削除されなくなります。例: "%#o"、"%8.0f"、"%+#10.3e"
0 数値形式の場合、フィールド幅の先頭にスペースの代わりに 0 を埋め込みます。整数形式の場合、 - フラグが存在する場合、または精度を指定している場合は、無視されます。
#include <stdio.h>

#define PAGE 668
int main() {
    
    


    printf("*%d*\n", PAGE);
    printf("*%2d*\n", PAGE);
    printf("*%10d*\n", PAGE);
    printf("*%-10d*\n", PAGE);
    return 0;
}

输出结果:
*668*
*668*
*       668*
*668       *
#include <stdio.h>

#define PAGE 3852.99
int main() {
    
    


    printf("*%f*\n", PAGE);
    printf("*%e*\n", PAGE);
    printf("*%4.2f*\n", PAGE);
    printf("*%3.1f*\n", PAGE);
    printf("*%10.3f*\n", PAGE);
    printf("*%10.3E*\n", PAGE);
    printf("*%+4.2f*\n", PAGE);
    printf("*%010.2f*\n", PAGE);
    return 0;
}
输出结果:
*3852.990000*
*3.852990e+03*
*3852.99*
*3853.0*
*  3852.990*
* 3.853E+03*
*+3852.99*
*0003852.99*

3.1.4 出力制御文字が必要な理由

1、0和1组成的代码可以表示数据也可以表示指令。
2、如果0和1组成的代码表示的是数据的话,那么同样的0和1代码组合以不同的输出格式输出就会有不同的输出结果。

おすすめ

転載: blog.csdn.net/qq_46292926/article/details/127550588