まぬねこの足跡。。。

備忘録+たのしさ+ひっそりと

C言語 文字列

文字列

  • 文字変数(char型)の配列を作る。
  • 文字列の終端(EOS):'\0'=0
  • &をつけずにアドレスを表現できる

   char str[6]; なら、str でOK

char str[6];

初期化+代入

char str[6] = { 'A', 'B', 'C', 'D', 'E', '\0' };
printf("%s\n", str);
char str[] = "ABCDE"; ←初期化時のみできる書き方
printf("%s\n", str);

表示イメージ

ABCDE

文字列処理関数

数字変換

変数 = atoi(文字配列名);

char str[] = "123";
int A = atoi(str);
printf("%d\n", A);

表示イメージ

123

文字列のコピー

文字列全コピー

strcpy(コピー先文字配列名, コピー元文字配列名);

char str[10];
strcpy(str, "ABCDE");
printf("%s\n", str);

表示イメージ

ABCDE

文字列の部分コピー

strncpy(コピー先文字配列名, コピー元文字配列名, コピーする文字数);
注意:コピー後、文字列最後の後にEOS('\0')を代入

char str1[] = "ABCDE", str2[10];
strncpy(str2, str1, 3);
str2[3] = '\0';
printf("%s\n", str2);

表示イメージ

ABC

文字列の連結

strcat(元の文字列が記憶された配列, 追加する文字列の記憶された配列);
注意:コピー先のサイズが足りないとバッファーオーバーラン

char str1[12] = "ABCDE";
char str2[] = "abcde";
strcat(str1, str2);
printf("%s\n", str1);

表示イメージ

ABCDEabcde

文字列合成

sprintf(収納先配列, 書式, 文字配列名1[, 文字配列名2…]);

char str[20];
char str1[12] = "ABCDE";
char str2[] = "abcde";
int i = 123;
sprintf(str, "%s%s%d\n", str1, str2, i);
printf(str);

表示イメージ

ABCDEabcde123

文字数を数える

文字数 = strlen(文字配列);

int kazu;
char str[20] = "ABCDE";;

kazu = strlen(str);
printf("%d\n", kazu);

表示イメージ

5

文字列の比較…同じ文字列か?

変数 = strcmp(文字配列1, 文字配列2);
※先頭文字列から比較し、文字コード

  • 全部 文字配列1 = 文字配列2 なら 0
  • 文字配列1 > 文字配列2 なら 1
  • 文字配列1 < 文字配列2 なら -1
char str1[] = "ABCDE";
char str2[] = "ABCDE";
char str3[] = "ABCDZ";
char str4[] = "ABCDA";

if (strcmp(str1, str2) == 0) {
    printf("同じ\n");
} else {
    printf("違う\n");
}
if (strcmp(str1, str3) == 0) {
    printf("同じ\n");
} else {
    printf("違う\n");
}
printf("%d\n",strcmp(str1, str2));
printf("%d\n",strcmp(str1, str3));
printf("%d\n",strcmp(str1, str4));

表示イメージ

同じ ←"ABCDE" = "ABCDE"
違う ←"ABCDE" < "ABCDZ";
0 ←"ABCDE" = "ABCDE"
-1 ←"ABCDE" < "ABCDZ";
1 ←"ABCDE" > "ABCDA"