1.はじめに
私たちの生活の中には、名前や州の証明書番号など、一元的に処理する必要がある長い文字列がたくさんあります。
現時点では、新しい概念であるstringを導入する必要があります。
"hello world!"
二重引用符で囲まれたこの文字列は、文字列リテラル、または略して文字列と呼ばれます。
注: 一重引用符は 1 文字を引用するために使用されます。一重引用符を使用して 2 つ以上の文字を引用することはできません。
'a'; // 字符a ' '; // 字符空格 'ab'; // err "abcdef"; // 字符串(由双引号引起的一串字符)
2 番目に、文字列の定義と保存
C言語では保存領域を空けるためにint型を使い、文字型としてcharを使いますが、文字列を格納できる型はあるのでしょうか?
答えは「いいえ」です。C には文字列を直接格納できる型がありません。
char はバイトであるため、1 文字しか格納できません。現時点では、同じデータ型の複数のデータ要素を格納するためにメモリ内に連続した格納スペースを開く配列を使用できるため、文字配列を通じて文字列を格納できます。
char arr[] = "hello world!";
上記のコードは、文字配列を使用して文字列を格納します。
1. 文字列は「\0」を隠して格納します
文字列の終了マークはエスケープ文字 '\0' です。文字列の長さを計算するとき、'\0' は終了マークであり、文字列の内容としてカウントされません。「\0」は非表示になります。
したがって、上記の文字配列はメモリ内に 13 バイトの記憶領域 (文字列リテラル値 + 非表示の '\0') を開きます。
char arr[] = "hello world!";
// 在内存中字符串实际存储
'h'、'e'、'l'、'l'、'o'、' '、'w'、'o'、'r'、'l'、'd'、'!'、'\0'
いくつかの例を通して、文字列に対する '\0' の影響を見てみましょう。
// 例子1
int main()
{
char ch1[] = "abcdef";
printf("%s", ch1); // %s打印字符串
return 0;
}
印刷結果は abcdef で、ch1 文字配列の末尾に隠れた '\0' 終了マークがあり、7 バイトのスペースが空くため、正常に印刷できます。
// 例子2
int main()
{
char ch2[] = { 'a','b','c','d','e','f' };
printf("%s", ch2);
return 0;
}
印刷結果は、abcdef の後に文字化けした文字が続きます。これは、ch2 文字配列に '\0' 終了マークがないため、6 バイトのスペースが空きます。
// 例子3
int main()
{
char ch2[] = { 'a','b','c','d','e','f','\0' };
printf("%s", ch2);
return 0;
}
例 2 に基づいて '\0' を追加すると 7 バイトのスペースが空き、印刷結果は abcdef であることがわかりました。そのため、%s が文字列を印刷するとき、文字列 '\0' の終わりに達すると停止します。プリント。
3. 文字列の印刷
1. %s モードで印刷します
%d は整数 10 進入出力形式で、%f は単精度浮動小数点数を出力し、%lf は倍精度浮動小数点数を出力し、%c は 1 文字を出力し、%x は 16 進数を出力します。
%sは文字列を印刷する形式であり、文字列 '\0' の終わりに達すると印刷を停止します。
int main()
{
char arr[] = "hello world!";
printf("%s\n", arr);
return 0;
}
2. 円形に印刷する
int main()
{
char arr[] = "hello world!";
for(int i = 0; i <= (sizeof(arr) / sizeof(char) - 2); i++)
{
printf("%c",arr[i]);
}
return 0;
}
①sizeof(arr)は文字配列が占める領域のサイズを計算し、sizeof(char)は文字配列内の各文字要素のサイズを計算し、両者をsizeof(arr)/sizeof(char)で割って数値を取得します。文字配列に格納されている文字の数。
②配列の添字と要素の順序には1ビットの差があり、最後の文字'\0'は出力する必要がないため、sizeof(arr) / sizeof(char) - 2で配列の添字を取得できます。最後の文字。
4番目、文字列の長さ
C 言語では、文字列の長さを調べるには、strlen()関数を使用する必要があり、 string.hのヘッダー ファイルをインクルードする必要があります。
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "hello world!";
printf("%d\n", strlen(arr));
return 0;
}
最終的な出力結果は 12 です。スペースも文字としてカウントされることに注意してください。
では、文字列の定義が次のように定義されている場合はどうなるでしょうか。
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = { 'h','e','l','l','o',' ','w','o','r','l','d','!' };
printf("%d\n", strlen(arr));
return 0;
}
このとき、印刷結果がランダムな値になっていることがわかりました。
これは、文字列の末尾が「\0」エスケープ文字であるためです。文字列の長さを計算する場合、「\0」は終了マークであり、文字列の内容としてカウントされません。
最初のコードは '\0' を '!' の後ろに隠しており、長さを計算するときに、隠れている '\0' を読み取って計算を停止する ('\0' はカウントしない) ため、結果は 12 になります。
2 番目のコードは、配列の通常の初期化です。「!」の後にエスケープ文字「\0」はなく、長さを計算するときに「\0」は読み取られないため、「\0」に遭遇するまでカウントダウンを続けます。したがって、生成される出力はランダムな値です。
2 番目のコードを少し変更すると、末尾にエスケープ文字 '\0' を追加するだけで正しい長さを計算できます。次のコード:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = { 'h','e','l','l','o',' ','w','o','r','l','d','!','\0' };
printf("%d\n", strlen(arr));
return 0;
}
五、文字配列のサイズ
配列型のサイズを計算するには、sizeof キーワードをバイト単位で使用する必要があります。
int main()
{
char arr[] = "hello world!";
printf("%d\n", sizeof(arr));
return 0;
}
上記のコードは文字列内の '\0' を非表示にし、'\0' は配列内の記憶領域も占有するため、上記のコードの出力結果は 13 になります。
int main()
{
char arr[] = { 'h','e','l','l','o',' ','w','o','r','l','d','!' };
printf("%d\n", sizeof(arr));
return 0;
}
上記のコードでは、文字配列の末尾に「\0」がないため、最終的な配列サイズは 12 として計算されます。
int main()
{
char arr[] = { 'h','e','l','l','o',' ','w','o','r','l','d','!','\0' };
printf("%d\n", sizeof(arr));
return 0;
}
上記のコードでは文字配列の末尾に「\0」があるため、最終的な配列サイズは 13 と計算されます。
6. sizeof() と strlen() を区別する
sizeof() と strlen() の間には必要な接続はありません。
sizeof は、C 言語の 32 の一般的なキーワードの 1 つで、型または変数が占めるメモリ領域のサイズ (バイト単位) を計算するために使用されます。
strlen は、string.h のヘッダー ファイルをインクルードする必要があるライブラリ関数です。文字列の長さを計算し、'\0' に遭遇したときに計算を停止するために使用されます (結果には '\0' が含まれません)。
以下に、コードを使用して説明します。
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "dengfenglai";
char arr2[] = { 'd','e','n','g','f','e','n','g','l','a','i' };
char arr3[] = { 'd','e','n','g','f','e','n','g','l','a','i','\0' };
printf("%d\n", strlen(arr1)); // 11
printf("%d\n", strlen(arr2)); // 随机值
printf("%d\n", strlen(arr3)); // 11
printf("%d\n", sizeof(arr1)); // 12
printf("%d\n", sizeof(arr2)); // 11
printf("%d\n", sizeof(arr3)); // 12
return 0;
}
上記のコードとコメントの回答を通じて、理解を深めることができます。