はじめに
- これまでの学習に続いて、今回は文字列操作の関数について学んだ結果をまとめてみました。
学習環境
- 今回はpaiza.ioのC言語のエディタを使いました。
strlen関数
- 文字列の長さ(バイト数)を取得する関数です。
- 文字列(配列)の先頭から
\0
までの長さが返されます。 -
strlen
関数の戻り値はsize_t
型ですが、ここではint
型にキャストして受け取っています。
Main.c
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
const char str[100] = "Test";
int length = (int)strlen(str);
printf("文字列の長さ:%d\n", length);
return 0;#include <stdio.h>
int main(int argc, char *argv[])
{
char buff[256];
gets(buff); // 256バイトを超えても終端文字が現れないとバッファオーバーフローが発生する!
printf("入力値:%s\n", buff);
return 0;
}
}
実行結果
文字列の長さ:4
strcmp関数
- 2つの文字列を比較するための関数です。
- 引数で指定した2つの文字列が等しければ
0
が返されます。- 戻り値が0であるかをチェックすれば、文字列が同一であるかをチェックできます。
-
memcmp関数と似ていますが、
memcmp
関数はバイト数を指定して比較するのに対して、strcmp
関数は「\0
が出現するまでの範囲」を比較します。
Main.c
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char str1[10] = "Test";
char str2[10] = "Test2";
str2[4] = '\0'; // 「2」を終端文字に置き換える
if (strcmp(str1,str2)==0) {
printf("「%s」と「%s」は同じです。", str1, str2);
} else {
printf("「%s」と「%s」は異なります。",str1, str2);
}
return 0;
}
実行結果
「Test」と「Test」は同じです。
strcpy関数
- 文字列をまるごとコピーする関数です。
- コピー先には、十分なメモリ領域が割り当てられていることが前提となります。
Main.c
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char* src = "Test";
char dest[100];
strcpy(dest, src);
printf("destは「%s」です。", dest);
return 0;
}
実行結果
destは「Test」です。
strcat関数
- 2つの文字列を連結させる関数です。
- 第1引数の末尾にある終端文字「\0」を削除して、第2引数の文字列をコピーして連結させます。
Main.c
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char* src = ",world!";
char dest[100] = "Hello";
strcat(dest, src);
printf("destは「%s」です。", dest);
return 0;
}
実行結果
destは「Hello,world!」です。
sprintf関数
- 書式を指定して文字列に書き込む関数です。
-
printf
は書式を指定して文字列を標準出力しましたが、sprintf
関数は書式を指定してメモリ領域に書き込みます。
Main.c
#include <stdio.h>
int main(void){
char str[100];
sprintf(str, "%sの所持金は%d円です。", "nkojima", 12611);
printf("%s\n", str);
return 0;
}
実行結果
nkojimaの所持金は12611円です。
scanf関数
- 書式を指定してキーボードからの入力を受け取ります。
-
scanf
関数では、キーボードの入力値を書き込んで欲しい「メモリ領域のアドレス」を渡す必要があるため、money
のアドレスである&money
を渡しています。- char型の配列である
name
については、&name[0]
と同義なのでそのままname
を引数として渡しています。
- char型の配列である
Main.c
#include <stdio.h>
int main(void){
char name[100];
int money;
printf("名前と所持金を半角スペース区切りで入力してください。\n");
scanf("%s %d", name, &money);
printf("%sの所持金は%d円です。\n", name, money);
return 0;
}
入力値
nkojima 12611
実行結果
名前と所持金を半角スペース区切りで入力してください。
nkojimaの所持金は12611円です。
補足:これまでの学習の歩み
- 【C】初めてのC言語(1. Hello world)
- 【C】初めてのC言語(2. 四則演算とフォーマット指定子)
- 【C】初めてのC言語(3. ポインタ)
- 【C】初めてのC言語(4. 構造体)
- 【C】初めてのC言語(5. 関数)
- 【C】初めてのC言語(6. 配列)
- 【C】初めてのC言語(7. for文)
- 【C】初めてのC言語(8. 2次元配列)
- 【C】初めてのC言語(9. 関数のプロトタイプ宣言)
- 【C】初めてのC言語(10. 構造体配列)
- 【C】初めてのC言語(11. ヘッダファイル)
- 【C】初めてのC言語(12. 3つのからくり構文+ポインタ演算)
- 【C】初めてのC言語(13. メモリを扱う標準関数)
- 【C】初めてのC言語(14. ヒープの利用)
- 【C】初めてのC言語(15. sizeofの注意点)
- 【C】初めてのC言語(16. 文字列の基本)
- 【C】初めてのC言語(17. 文字列リテラル)
- 【C】初めてのC言語(18. 文字列の受け渡し)
- 【C】初めてのC言語(19. 文字列とバッファオーバーフロー)
参考URL
-
スッキリわかるC言語入門 第2版
- p.417~p.426