おさえておきたいプログラミングの基本
文字列はchar型の配列であり、配列とポインタの考え方も適用できます。
すでに学んだように、C言語で文字列を扱う場合、char型の配列変数を使います(基本編5日目参照)。C言語には文字列を操作する様々な関数が存在します。ここではそういった関数と使い方を紹介していきます。
listex4-1:main.c#include <stdio.h>
#include <string.h>
int main(int argc,char** argv){
char s[10];
int len;
// 文字列のコピー
strcpy(s,"ABC");
printf("s=%s\n",s);
// 文字列の結合
strcat(s,"DEF");
printf("s=%s\n",s);
// 文字列の長さ
len = strlen(s);
printf("文字列の長さ:%d\n",len);
return 0;
}
実行結果
まずは、文字列の結合とコピーの関数を見てみましょう。使用されている関数は以下のとおりです。(表4-1)
表4-1.文字列を操作する関数関数 | 書式 | 意味 | 使用例 |
---|---|---|---|
strcpy() | strcpy(char* s1,char* s2); | 右辺の文字列を左辺の文字列変数にコピーする。 | strcpy(s,"Hello"); |
strcat() | strcat(char* s1,char* s2); | 右辺の文字列を左辺の文字列変数に追加する。 | strcat(s,"World"); |
2行目で変数sは、宣言されると初期状態サイズ10のchar型の配列として宣言されます。(図4-1①)
8行目で、strcpy()文字列変数sに対して、"ABC"という文字列をコピーしています(図4-1②)。
その後、同じ変数に11行目でstrcat()関数を用いて"DEF"という文字列を追加しているので、最終的にsに入っている文字列は、"ABCDEF"となります。(図4-1③)
図4-1.strcpy(),strcat()の処理続いて、文字列の長さをstrlen()関数を用いて取得しています。strlen関数は、以下のような処理をする関数です。(表4-2)
表4-2.文字列の長さを調べる関数関数 | 書式 | 意味 | 使用例 |
---|---|---|---|
strlen() | strlen(char* s); | ()に文字列を与えると、戻り値として長さを得られる。 | int l = strlen("Hello"); |
文字列の長さとは、char型の配列の0番の文字から、最後に'¥0'にたどり着くまでに入っている文字の数を指します。
次は、文字列通しを比較する関数を見てみましょう。まずは、以下のプログラムを実行してみてください。
listex4-2:main.c#include <stdio.h>
#include <string.h>
int main(int argc,char** argv){
char s1[256],s2[256];
printf("s1=");
scanf("%s",s1);
printf("s2=");
scanf("%s",s2);
if(strcmp(s1,s2)==0){
printf("s1とs2は等しい\n");
}else{
printf("s1とs2は等しくない\n");
}
return 0;
}
実行結果①(入力した値が同じ場合)
プログラムを実行すると、コマンドプロンプトが出て、文字列を入力するように要求してきます。これを二回繰り返して、s1,s2に文字列を代入します。 そして、最終的に、s1とs2が同じ文字列であれば、「s1とs2は等しい」そうでなければ「s1とs2は等しくない」と表示します。
文字列の比較は、strcmp()関数を用います。概要は以下のとおりです。(表4-3)
表4-3.文字列が等しいかどうかを調べる関数関数 | 書式 | 意味 | 使用例 |
---|---|---|---|
strcmp() | strcpy(char* s1,char* s2); | 文字列s1,s2が等しいと0、 等しくなければそれ以外の値を返す。 | if(strcmp(s,"Hello")==0) |
続いては、数値と文字列の変換をみてみましょう。まずは、文字列を数値に変換するパターンから見てみましょう。
listex4-3:main.c#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
char s1[] = "1000";
char s2[] = "12.345";
int a;
double b;
a = atoi(s1);
b = atof(s2);
printf("a=%d b=%f\n",a,b);
return 0;
}
実行結果
実行結果から判るように、文字列として与えられた数値が、それぞれ整数(int)・実数(double)として取得できました。ここで使用している関数は以下のとおりです。(表4-4)
表4-4.文字列を数値に変換する関数関数 | 書式 | 意味 | 使用例 |
---|---|---|---|
atoi() | atoi(char* s); | 与えられた文字列を整数(int)に変える。 | int n = atoi("100"); |
atof() | atof(char* s); | 与えられた文字列を実数(double)に変える。 | double d = atof("3.14"); |
今度は逆に、数値から文字列を作ってみましょう。このときに用いることが出来るのは、sprintf()関数です。以下のサンプルを実行してみてください。
listex4-4:main.c#include <stdio.h>
#include <string.h>
int main(int argc, char** argv) {
char s1[256],s2[256];
int a = 100,b = 200;
sprintf(s1,"%d",a);
sprintf(s2,"bの値は%dです。",b);
puts(s1);
puts(s2);
return 0;
}
実行結果
sprintf()関数は、printf()と同じ要領で文字列を作成できる非常に便利な関数です。例えば、sをcharの配列とすると
sprintf()の使用例sprintf(s,"HelloWorld");
とすると、sには、"HelloWorld"という文字列が入ります。同様にして、7行目の処理を行えば、s1には、"100"という文字列が入ります。また、8行目のように、数値を含む文字列も容易に作ることが可能です。
なお、文字列を操作する関数ではないのですが、9行目、10行目に出ているputs()関数は、()に入った文字列を表示し、改行する関数です。例えば
puts()の使用例puts("HelloWorld");
とすれば、「HelloWorld」と表示されて、改行されます。printf()の場合は、改行する場合はあえて'¥n'を最後に入れる必要がありましたが、puts()関数にはその必要がありません。
以上がC言語で用いられる主要な文字列関数です。ただ、文字列関数を用いるとき、特に、何らかの文字列を新たに生成する時には注意が必要です。
例えば、文字列の配列のサイズが10しかないのに、それ以上の長さの文字列を代入することはできません。このような場合、コンパイル時にエラーは出ませんが、実行時にシステムが異常終了するなどといったことが起こるので、気をつけましょう。(図4-2)
図4-2.配列から文字列がオーバーしないように注意が必要練習問題 : 問題4.
一週間でわかるC言語・C++言語がオンライン講座になりました!動画と音声によってさらにわかりやすくなりました!! 1講座で2つの言語を学ぶことができる上に、練習問題の回答もダウンロードできます。
Read →本講座が「1週間でC言語の基礎が学べる本」として書籍化されました!サイトの内容プラスアルファでより学習しやすくなっています!Impressより発売中です!!
Read →