C言語-文字列研究ノート(1)

木を植えるのに最適な時期は10年前で、今がそれに続きます!

私は以前に配列について学びました、そしてあなたはすでに文字配列という言葉を聞いたことがあると思います!C言語の文字列定数(C言語では文字列リテラルと呼ばれます)と文字変数について学びましょう。

1つ、文字列リテラル

1.文字列リテラルのエスケープシーケンス

文字列リテラルには、エスケープシーケンス(\ nおよびその他のエスケープシーケンス)を含めることもできます。注:16進数と8進数のエスケープシーケンスはより複雑なので、慎重に使用してください。

例えば:

"hello\nworld\n"

出力は次のとおりです。こんにちは

                  世界

2.文字列変数の継続

文字列リテラルが長すぎて1行だけに配置できない場合があります。通常、\は末尾で終了し、C言語は次の行に入力を続けることができます。ただし、このインデントの効果は明ら​​かではありません。例は次のとおりです。

#include<stdio.h>
int main(void)
{
	printf("ABCDE\
	FGHI\n");
	
	printf("abcde\
fghi\n");
	printf("123"
	"456\n");
}

\を使用するときに文字列を行に出力する場合、インデント形式を保証する方法がないため、文字列リテラル、つまり「...」を継続する方法があることがわかります。 .. "2つの連続した同じ文字列に組み合わせることができます。

3.文字列リテラルを格納します。

基本的に、C言語は文字列リテラルを文字配列として扱います。(ただし、文字配列は文字列ではありません!文字列の最後に\ 0が付きます!)

長さnの文字列リテラルがC言語で表示されると、C言語は長さn +1のスペースを割り当てます。このメモリは文字列リテラルの文字を格納するために使用され、余分なスペースは文字列の終わりに余分な文字(空の文字)をマークするために使用されます。この\ 0は、文字列リテラルの終わりの記号です。エスケープされます文字\ 0を置き換えます。注:「0」の代わりに、ヌル文字のコード値は0であり、ゼロ文字のASCIIコードは48です。

例:文字列リテラル「abc」は、4文字(a、b、c、\ 0)の配列として格納されます。

          文字列リテラル ""(文字列リテラルは空にすることができます。1つの空の文字は\ 0として格納されます)

では、文字列リテラルを使用してパラメータをprintf関数に渡す場合、何を渡すのでしょうか。配列として扱われるため、コンパイラーは当然、char *型のポインターと見なします。

例:printf( "abc");

          printf関数が呼び出されると、「abc」のアドレス(つまり、文字aを格納するメモリユニットへのポインタ)が渡されます。

次のコードとその実行結果を見てください

#include<stdio.h>

int main()
{
	char *a,*b,c;
	a = "abc";
	b = "";
	c = '0';
	
	printf("a = %s\n",a);	
	printf("b[0] = %d\n",b[0]);
	printf("b = %s\n",b); 
	printf("c = %c\n",c);
	return 0;
}

""空の文字列には整数0である要素\ 0が1つだけありますが、文字定数 '0'はありません!

4.文字列リテラルの操作

ちょうど今、私たちはこのコードを見ました

#include<stdio.h>

int main()
{
	char *a,*b,c;
	a = "abc";
	b = "";
	c = '0';
	
	printf("a = %s\n",a);	
	printf("b[0] = %d\n",b[0]);
	printf("b = %s\n",b); 
	printf("c = %c\n",c);
	return 0;
}

一般に、文字列リテラルは、char *ポインターをC言語で使用できる場合に使用できます。たとえば、文字列リテラルは、上記のchar * a、a = "abc"などの代入記号の右側に表示できます。この代入演算により、ポインタは文字列の最初の文字を指すようになります。

C言語ではポインタに添え字を付けることができるため、文字列リテラルに添え字を付けることもできます。たとえば、char ch; ch = "abc" [0]です。

注:文字列リテラルは変更しないでください。(文字列リテラルはプログラムの「コードセグメント」と呼ばれる場所にあり、読み取り専用なので、ここでは説明しません)

2つの文字列変数

一部のプログラミング言語では、データ型が文字列変数用に特別に提供されています。C言語では、通常、1次元配列を使用して文字列を格納します(ただし、文字列がヌル文字で終わるようにすることを忘れないでください!!!)

文字列処理関数を自分で作成するときは、ヌル文字の処理も考慮する必要があります。

#define STR_LEN 10

  ..。

char str [STR_LEN + 1]; //ここで、STR_LENは10として定義され、strは最大10文字の文字列を格納できることを強調し、STR_LEN +1を使用してstr配列の宣言にヌル文字を格納します。

もちろん、STR_LEN + 1の長さの文字配列を宣言することは、STR_LENの長さの文字列を格納するために常に使用されることを意味するわけではありません。文字列の長さは、文字ではなく、空の文字の位置に依存します。文字列の長さを格納する配列。STR_LEN +1は、文字列の最大長を制限するだけです。

1.文字列変数を初期化します

宣言時に初期化できます

char str1[] = "hello world"

配列の長さが文字列リテラルの長さよりも大きいことを確認する必要があるため、その長さを省略できます。この場合、コンパイラは自動的にnull文字を追加します。

文字列リテラル「helloworld」が配列str1にコピーされ、コンパイラが自動的にnull文字を追加するため、文字列変数と見なすことができます。

もちろん、他の初期化方法もありますが、上記の方法を覚えておいてください。上記の方法が最も一般的に使用されます。

2.文字配列と文字ポインタ

char *a = "hello world"
char a[] = "hello world"

これらの2つの宣言は同じように見えます。前者はポインタaを宣言し、後者は配列aを宣言します。どちらも文字列と見なすことができます。ただし、両者には大きな違いがあり、上記の2つが互換性があるとは考えられません。

ポインタとして宣言する場合、文字列リテラルを変更することはできません。(前述の読み取り専用領域のコードスニペットを覚えておいてください)

注:ポインター変数は、使用する前に初期化する必要があります。

3. puts()、gets()、printf()、scanf()、fgets()関数の使用。

 

 

おすすめ

転載: blog.csdn.net/qq_51182221/article/details/115217465