一週間で身につくC言語の基本

おさえておきたいプログラミングの基本

【応用編:4日目】 文字列とポインタ

文字列はchar型の配列であり、配列とポインタの考え方も適用できます。

4-1.様々な文字列関数

(1) 文字列再び

すでに学んだように、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;
}
実行結果
s=ABC s=ABCDEF 文字列の長さ:6

(2) 文字列の結合とコピー

まずは、文字列の結合とコピーの関数を見てみましょう。使用されている関数は以下のとおりです。(表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()の処理
strcpy(),strcat()の処理

(3) 文字列の長さ

続いて、文字列の長さをstrlen()関数を用いて取得しています。strlen関数は、以下のような処理をする関数です。(表4-2)

表4-2.文字列の長さを調べる関数
関数書式意味使用例
strlen()strlen(char* s);()に文字列を与えると、戻り値として長さを得られる。int l = strlen("Hello");

文字列の長さとは、char型の配列の0番の文字から、最後に'¥0'にたどり着くまでに入っている文字の数を指します。

(4) 文字列の比較

次は、文字列通しを比較する関数を見てみましょう。まずは、以下のプログラムを実行してみてください。

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=ABC ← キーボードから文字列を入力しEnterキーを押す。 s2=ABC ← キーボードから文字列を入力しEnterキーを押す。 s1とs2は等しい
実行結果②(入力した値が等しくない場合)
s1=ABC ← キーボードから文字列を入力しEnterキーを押す。 s2=DEF ← キーボードから文字列を入力しEnterキーを押す。 s1とs2は等しくない

プログラムを実行すると、コマンドプロンプトが出て、文字列を入力するように要求してきます。これを二回繰り返して、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)

3-2.数値・文字列の変換

(1) 文字列から数値への変換

続いては、数値と文字列の変換をみてみましょう。まずは、文字列を数値に変換するパターンから見てみましょう。

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;
}
実行結果
a=1000 b=12.345000

実行結果から判るように、文字列として与えられた数値が、それぞれ整数(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");

(2) 数値から文字列の変換

今度は逆に、数値から文字列を作ってみましょう。このときに用いることが出来るのは、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;
}
実行結果
100 bの値は200です。

sprintf()関数は、printf()と同じ要領で文字列を作成できる非常に便利な関数です。例えば、sをcharの配列とすると

sprintf()の使用例
sprintf(s,"HelloWorld");

とすると、sには、"HelloWorld"という文字列が入ります。同様にして、7行目の処理を行えば、s1には、"100"という文字列が入ります。また、8行目のように、数値を含む文字列も容易に作ることが可能です。

なお、文字列を操作する関数ではないのですが、9行目、10行目に出ているputs()関数は、()に入った文字列を表示し、改行する関数です。例えば

puts()の使用例
puts("HelloWorld");

とすれば、「HelloWorld」と表示されて、改行されます。printf()の場合は、改行する場合はあえて'¥n'を最後に入れる必要がありましたが、puts()関数にはその必要がありません。

(3) 文字列関数における注意点

以上がC言語で用いられる主要な文字列関数です。ただ、文字列関数を用いるとき、特に、何らかの文字列を新たに生成する時には注意が必要です。

例えば、文字列の配列のサイズが10しかないのに、それ以上の長さの文字列を代入することはできません。このような場合、コンパイル時にエラーは出ませんが、実行時にシステムが異常終了するなどといったことが起こるので、気をつけましょう。(図4-2)

図4-2.配列から文字列がオーバーしないように注意が必要
配列から文字列がオーバーしないように注意が必要

練習問題 : 問題4.

一週間で学べるコースの一覧
Udemy
...
2024/10/01

Udemyでも学びましょう!

一週間でわかるC言語・C++言語がオンライン講座になりました!動画音声によってさらにわかりやすくなりました!! 1講座で2つの言語を学ぶことができる上に、練習問題の回答もダウンロードできます。

Read →
Impress一週間シリーズ
1週間でC言語の基礎が学べる本
2024/10/01

書籍化された一週間シリーズ

本講座が「1週間でC言語の基礎が学べる本」として書籍化されました!サイトの内容プラスアルファでより学習しやすくなっています!Impressより発売中です!!

Read →
Impress一週間シリーズ
...
2024/10/01

書籍化された一週間シリーズ

一週間シリーズは書籍化されています。こちらもどうぞ!

Read →
プログラマーなら欲しいグッズ
プログラミンググッズ

プログラミンググッズ

快適なプログラミング環境を構築したい人々にぜひとも揃えてほしいグッズです。

Read →
制作・管理
シフトシステム株式会社

シフトシステム株式会社

このサイトはシフトシステム株式会社によって制作・管理がなされています。

Read →