工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C での文字ポインターと関数の使用法をマスターする

C の文字ポインタとは何ですか?

文字ポインタ 文字型のアドレス、または文字配列(文字列)の最初の文字のアドレスを格納します。文字ポインタは、文字列を操作するときに非常に便利です。

C には文字列データ型はありません。「char」型の配列は文字列とみなされます。したがって、char 型配列のポインタは文字列を表します。この char ポインタは、文字列を処理する関数に引数として渡すことができます。

文字ポインタの宣言

文字ポインタは、文字または文字配列を指します。したがって、文字ポインタを宣言するには、次の構文を使用します。

char *pointer_name;

文字ポインタの初期化

文字ポインタを宣言した後、文字変数のアドレスで初期化する必要があります。文字配列がある場合は、文字配列の名前またはその最初の要素のアドレスを指定するだけで、文字ポインタを初期化できます。

文字の文字ポインタ

以下は、文字タイプの文字ポインタを初期化するための構文です。

char *pointer_name = &char_variable;

文字配列の文字ポインタ

以下は、文字配列 (文字列) の文字ポインタを初期化する構文です。

char *pointer_name = char_array;
/*or*/
char *pointer_name = &char_array[0];

文字ポインタの例

次の例では、文字と文字配列の 2 つの変数があります。文字と文字配列のアドレスを格納するために 2 つのポインタ変数を取得し、文字ポインタを使用して変数の値を出力します。

#include <stdio.h>
int main() {
 // Declare two variables
 char x = 'P';
 char arr[] = "TutorialsPoint";
 // Declaring character pointers
 char *ptr_x = &x;
 char *ptr_arr = arr;
 // Printing values
 printf("Value of x : %c\n", *ptr_x);
 printf("Value of arr: %s\n", ptr_arr);
 
 return 0;
}

出力

コードを実行し、その出力を確認します-

Value of x : P
Value of arr: TutorialsPoint

文字ポインタを理解する

文字列は次のように配列として宣言されます-

char arr[] = "Hello";

文字列は NULL で終了する文字の配列です。上記の配列の最後の要素は NULL 文字 (\0) です。

char型のポインタを宣言し、0番目の位置にある文字のアドレスを割り当てます-

char *ptr = &arr[0];

配列自体の名前は 0 番目の要素のアドレスであることに注意してください。

char *ptr = arr;

文字列は、配列変数 (角括弧なし) の代わりにポインターを使用して宣言できます。

char *ptr = "Hello";

これにより、文字列がメモリに保存され、そのアドレスが ptr に保存されます。 ptr をインクリメントすることで文字列をトラバースできます。

while(*ptr != '\0'){
 printf("%c", *ptr);
 ptr++;
}

文字配列へのアクセス

%s 書式指定子を使用して文字配列を出力する場合は、文字ポインターの名前を使用して実行できます。ただし、文字配列の各文字にアクセスしたい場合は、文字ポインタ名の前にアスタリスク (*) を使用してから、値をインクリメントする必要があります。

完全なプログラムコードは次のとおりです-

#include <stdio.h>
int main(){
 char arr[] = "Character Pointers and Functions in C";
 char *ptr = arr;
 while(*ptr != '\0'){
 printf("%c", *ptr);
 ptr++;
 }
}

出力

コードを実行し、その出力を確認します-

Character Pointers and Functions in C

あるいは、ptr を %s 形式で printf() に渡して文字列を出力します。

#include <stdio.h>
int main(){
 char arr[] = "Character Pointers and Functions in C";
 char *ptr = arr;
 printf("%s", ptr);
}

出力

このコードを実行すると、同じ出力が得られます -

Character Pointers and Functions in C

文字ポインタ関数

「string.h」ヘッダー ファイルは、文字列の長さの検索、文字列のコピー、2 つの文字列の比較などの文字列処理を実行する多数のライブラリ関数を定義します。これらの関数は char ポインタ引数を使用します。

strlen() 関数

strlen() 関数は長さ、つまり文字列内の文字数を返します。 strlen() 関数のプロトタイプは次のとおりです-

int strlen(char *)

例 1

次のコードは、文字列の長さを出力する方法を示しています-

#include <stdio.h>
#include <string.h>
int main(){
 char *ptr = "Hello";
 printf("Given string: %s \n", ptr);
 printf("Length of the string: %d", strlen(ptr));
 return 0;
}

このコードを実行すると、次の出力が生成されます-

Given string: Hello 
Length of the string: 5

例 2

事実上、strlen() 関数は、以下に示すように、ユーザー定義関数 str_len() に従って文字列の長さを計算します -

#include <stdio.h>
#include <string.h>
int str_len(char *);
int main(){
 char *ptr = "Welcome to Tutorialspoint";
 int length = str_len(ptr);
 printf("Given string: %s \n", ptr);
 printf("Length of the string: %d", length);
 
 return 0;
}
int str_len(char *ptr){
 int i = 0;
 while(*ptr != '\0'){
 i++;
 ptr++;
 }
 return i;
}

このコードを実行すると、次の出力が生成されます-

Given string: Welcome to Tutorialspoint 
Length of the string: 25

strcpy() 関数

代入演算子 ( =) は、文字列値を文字列変数、つまり char ポインターに割り当てるためには使用されません。代わりに、次のプロトタイプで strcpy() 関数を使用する必要があります -

char * strcpy(char * dest, char * source);

例 1

次の例は、 strcpy() 関数の使用方法を示しています-

#include <stdio.h>
#include <string.h>
int main(){
 char *ptr = "How are you doing?";
 char *ptr1;
 strcpy(ptr1, ptr);
 printf("%s", ptr1);
 return 0;
}

strcpy() 関数は、宛先文字列 ptr1 へのポインタを返します。

How are you doing?

例 2

内部的には、 strcpy() 関数はユーザー定義の str_cpy() 関数に次のロジックを実装します-

#include <stdio.h>
#include <string.h>
void str_cpy(char *d, char *s);
int main(){
 char *ptr = "Using the strcpy() Function";
 char *ptr1;
 str_cpy(ptr1, ptr);
 printf("%s", ptr1);
 return 0;
}
void str_cpy(char *d, char *s){
 int i;
 for(i = 0; s[i] != '\0'; i++)
 d[i] = s[i];
 d[i] = '\0';
}

彼のコードを実行すると、次の出力が生成されます-

Using the strcpy() Function

この関数は、NULL 文字「\0」に達するまで、ソース文字列からコピー先に各文字をコピーします。ループの後、宛先配列の末尾に「\0」文字が追加されます。

strcmp() 関数

通常の比較演算子 (<、>、<=、>=、==、!=) は 2 つの文字列の比較に使用できません。代わりに、「string.h」ヘッダー ファイルの strcmp() 関数を使用する必要があります。この関数のプロトタイプは次のとおりです-

int strcmp(char *str1, char *str2)

strcmp() 関数には 3 つの可能な戻り値があります -

例 1

次の例は、C プログラムで strcmp() 関数を使用する方法を示しています。

#include <stdio.h>
#include <string.h>
int main(){
 char *s1 = "BASK";
 char *s2 = "BALL";
 int ret = strcmp(s1, s2);
 if (ret == 0)
 printf("Both strings are identical\n");
 else if (ret > 0)
 printf("The first string appears after the second string \n");
 else
 printf("The first string appears before the second string \n");
 return 0;
}

コードを実行し、その出力を確認します-

The first string appears after the second string

s1 を BACK に変更し、コードを再度実行します。これで、次の出力が得られます-

The first string appears before the second string

例 2

次のコードに示すように、ユーザー定義関数 str_cmp() を使用すると、同様の結果を取得できます-

#include <stdio.h>
#include <string.h>
int str_cmp(char *str1, char *str2);
int main(){
 char *s1 = "The Best C Programming Tutorial Available Online";
 char *s2 = "The Best C Programming Tutorial Available Online";
 int ret = str_cmp(s1, s2);
 if (ret == 0)
 printf("Both strings are identical\n");
 else if (ret > 0)
 printf("The first string appears after the second string\n");
 else
 printf("The first string appears before the second string\n");
 return 0;
}
int str_cmp(char *str1, char *str2) {
 while (*str1 != '\0' && *str2 != '\0') {
 if (*str1 != *str2) {
 return *str1 - *str2;
 }
 str1++;
 str2++;
 }
 // If both strings are equal, return 0
 
 return 0;
}

このコードを実行すると、次の出力が生成されます-

Both strings are identical

str_cmp() 関数は、いずれかの文字列内の文字がなくなるか、文字が等しくなるまで、文字列内の同じインデックスにある文字を比較します。

同じインデックスで不等文字を検出した場合は、その ASCII 値の差分を返します。ループが終了すると「0」を返します。


C言語

  1. C - 配列
  2. C++ 配列
  3. C++ データ構造
  4. C# foreach ループ
  5. マスター C インクリメント演算子とデクリメント演算子:使用法とベスト プラクティス
  6. C - 再帰
  7. C# コンストラクター
  8. C# - 名前空間
  9. C# 式、ステートメント、およびブロック (例付き)
  10. C# 静的キーワード
  11. C if...else ステートメント