C言語 | 高度な機能 | 文字列操作 - strcat(), strlen(), strcpy(), strcmp() など

標準ライブラリには、文字列の連結、長さの取得、コピー、比較、書式化を行う関数が用意されている。

文字列の連結とコピー

文字列関数は string.h に宣言されている。

char *strcat(char *destination, const char *source);

strcat() は、ヌル終端文字列 destination の末尾へ source を追加する。宛先バッファーには十分な領域が必要であり、2つの領域が重なってはならない。

コード1

#include <stdio.h>
#include <string.h>

int main() {
 char text[256] = "Kitty on your lap";
 strcat(text , " and a book");
 printf("%s\n" , text);
 return 0;
}

文字列の長さを取得するには strlen() を使う。末尾のヌル文字は長さに含まれない。

size_t strlen(const char *string);

ヌル終端文字列をコピーするには strcpy() を使う。

char *strcpy(char *destination, const char *source);

コード2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
 const char *left = "Kitty on your lap";
 const char *right = " and a book";
 char *text = malloc(strlen(left) + strlen(right) + 1);
 if (text == NULL) return 1;

 strcpy(text , left);
 strcat(text , right);
 printf("%s\n" , text);
 free(text);
 return 0;
}

文字列の比較

文字列の内容を比較するには strcmp() を使う。

int strcmp(const char *left, const char *right);

文字列が同じ場合は0、辞書順で left が前なら負の値、後なら正の値を返す。

コード3

#include <stdio.h>
#include <string.h>

int main() {
 char left[255] , right[255];
 printf("2つの文字列を入力してください。 >");
 scanf("%254s %254s" , left , right);

 if (strcmp(left , right) == 0)
   printf("文字列は同じです。\n");
 else if (strcmp(left , right) < 0)
   printf("%s は %s より前です。\n" , left , right);
 else
   printf("%s は %s より後です。\n" , left , right);
 return 0;
}

文字列の書式化

sprintf() は書式付き出力をバッファーへ書き込み、sscanf() は文字列から書式付きの値を読み取る。

int sprintf(char *buffer, const char *format, ...);
int sscanf(const char *buffer, const char *format, ...);

コード4

#include <stdio.h>

int main() {
 char text[256];
 sprintf(text , "Today is %d-%02d-%02d." , 2017 , 11 , 26);
 printf("%s\n" , text);
 return 0;
}

実用コードでは、出力が宛先バッファーを超えないように、利用可能であれば snprintf() などのサイズ制限付き関数を優先する。