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 つの可能な戻り値があります -
- 両方の文字列が同一であると判明した場合は、「0」を返します。
- str1 内の最初の不一致文字の ASCII 値が str2 内の対応する文字よりも大きい場合、関数は正の整数を返します。これは、辞書のように、アルファベット順で str1 が str2 の後に現れることを意味します。
- str1 内の最初の不一致文字の ASCII 値が str2 内の対応する文字より小さい場合、関数は負の整数を返します。これは、辞書のように、アルファベット順で str1 が str2 の前に現れることを意味します。
例 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言語