Python使いのためのC言語での文字列の結合:strcat、snprintf

  • URLをコピーしました!
目次

C言語

前回、C言語での四則演算を色々と試してみました。

その中で、文字列(PythonならStr型、C言語ならChar型)はC言語では「+」では結合できないことを知りました。

#include <stdio.h>

int main(void)
{
    char str1[] = "str1";
    char str2[] = "str2";

    printf(str1 + str2);
}

実行結果
str_connect1.c:8:17: error: invalid operands to binary expression ('char [5]' and 'char [5]')
    printf(str1 + str2);
           ~~~~ ^ ~~~~
1 error generated.

そのため二つの文字列を連続的に表示する場合は変換指定子を使ってこのように表示することまでは分かりました。

#include <stdio.h>

int main(void)
{
    char str1[] = "str1";
    char str2[] = "str2";

    printf("%s%s", str1, str2);
}

実行結果
str1str2

ただこの場合、連続的に表示しているだけであり、文字列を結合したことにはなりません。

ということで今回はC言語での文字列の結合の方法を学んでいきたいと思います。

Pythonでの文字列の結合

まずは比較としてPythonでの文字列の結合を見ていきましょう。

Pythonの文字列の結合方法で私が知っているのはこの二つ。

str1 = 'str1'
str2 = 'str2'

str3 = str1 + str2

str4 = ''.join([str1, str2])

print(str3)
print(str4)

実行結果
str1str2
str1str2

str3にあるように「+」で繋ぐことで結合させる方法(C言語ではエラーとなる方法)とstr4のように「’繋げる間の文字列’.join(文字列のリスト)」で結合させる方法です。

ほとんどの場合は、str3のように「+」を用いて結合させています。

ただ複数の文字を同じ文字列を間に挟んで連結させる場合はstr4の結合方法の方が楽な場合もあります。

とは言ってもjoin関数は個人的にはこう言った場合でもない限り忘れているので、複数の文字を同じ文字列を挟んで結合させる場合は、こんな感じでfor関数を使って結合させてしまう気がします。

str1 = 'str1'
str2 = 'str2'

str_list = [str1, str2]

str5 = ''
for s in str_list:
    str5 = str5 + s
    
print(str5)

実行結果
str1str2

あまり美しいとは言えませんが、これでも十分大量の文字を結合させることができるので、まぁいいのではないでしょうか。

C言語での文字の結合1:strcat

C言語で文字を結合する方法その1としては「strcat関数」を使うことです。

strcat関数は「string.h」に含まれる関数ですので、「string.h」をインクルードして使用します。

使い方としては「strcat(“結合する文字列1”, “結合する文字列2”)」で「結合する文字列1に結合する文字列2が結合」されます。

つまり結合後の結果は「結合する文字列1」に上書きされるので注意です。

ということで試してみましょう。

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

int main(void)
{
    char str1[] = "str1";
    char str2[] = "str2";

    strcat(str1, str2);

    printf("%s", str1);
}

実行結果
/bin/sh: line 1: 76538 Illegal instruction: 4  "/path to program/str_connect/"str_connect3

ということで「Illegal instruction」というエラーが出てしまいました。

これはプログラム上で何らかのやってはいけない(エラーのような間違いではなく)操作をやってしまった時にでてくるようです。

ここでいうやってはいけない操作とは「文字列の長さのオーバー」のようでした。

先ほどお話しした通りstrcat関数は元々ある文字列に対して、他の文字列を追加する関数で、最初の文字列は上書きされます。

つまりPythonでいうとこんな感じ。

str1 = 'str1'
str2 = 'str2'

str1 = str1 + str2

print(str1)

実行結果
str1str2

ただし前回勉強したようにC言語での文字列は、その文字列を定義する際に「長さ」も定義されます。

つまり「char str1[] = “str1”;」と定義すると文字列str1の長さは「s」、「t」、「r」、「1」、「\0(終端文字)」の5文字と定義されます。

そこに同じく5文字の文字列str2を結合しようとすると、文字列1で確保した長さをオーバーしてしまい、エラーとなってしまうわけです。

そこで最初に文字列str1の長さを結合後の長さ「9(4文字+4文字+終端文字)」としてみましょう。

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

int main(void)
{
    char str1[9] = "str1";
    char str2[] = "str2";

    strcat(str1, str2);

    printf("%s", str1);
}

実行結果
str1str2

これで問題なく文字列を結合することができました。

しかし最初に文字列の長さを定義しておくのは困難ですし、文字列が上書きされてしまうのであまり好ましくはない場面が多いことでしょう。

C言語での文字の結合2:snprintf

上書きをしない、最初に文字列の数を定義しない方法としては「snprintf関数」を使う方法があります。

これは「stdio.h」のヘッダーファイルに含まれる関数で、「snprintf(出力する変数名, 文字列の長さ, 変換指定子, 文字列1, 文字列2…);」として結合します。

ということで試してみましょう。

#include <stdio.h>

int main(void)
{
    char str1[] = "str1";
    char str2[] = "str2";

    char str3[9];
    snprintf(str3, 9, "%s%s", str1, str2);

    printf("%s", str3);
}

実行結果
str1str2

この場合、文字列str1を上書きするわけではないので文字列str1の長さを定義する際に結合後の長さを指定する必要はありません。

注意点としては、結合後の文字列str3を定義する際に空の文字列として定義し、結合後の長さを指定する必要があることです(char str3[9];)。

ちなみに上の例では2つの文字列を結合していますが、多数の文字列を一度に結合することができます。

#include <stdio.h>

int main(void)
{
    char str1[] = "str1";
    char str2[] = "str2";
    char str3[] = "str3";
    char str4[] = "str4";
    char str5[] = "str5";

    char str6[21];
    snprintf(str6, 21, "%s%s%s%s%s", str1, str2, str3, str4, str5);

    printf("%s", str6);
}

実行結果
str1str2str3str4str5

ということでC言語での文字列の結合方法が分かりました。

ただ実際、個人的には文字列の結合はあまり使う場面が少なかったりします。

むしろ文字列の分割をやることが多いので、次回はC言語での文字列の分割を勉強していきたいと思います。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次
閉じる