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() などのサイズ制限付き関数を優先する。