C言語
前回、C言語での文字列の結合(strcat関数、snprintf関数)を勉強してみました。
今回は結合の逆、分割をC言語ではどうやってやるのか勉強してきましょう。
特にCSVやTSVファイルなどのデータを分割したり、ファイル名と拡張子を分割したりと、文字列に関しては結合よりも分割の方が活躍の場面が(少なくとも個人的には)多いと思うので、しっかり使えるようにしていきたいものです。
それでは始めていきましょう。
Pythonでの文字列の分割
まずはPythonでの文字列の分割方法を見ていきましょう。
Pythonでは「split関数」を使って、特定の文字によって文字列を分割することができます。
strs = 'str1,str2,str3,str4,str5'
strs_list = strs.split(',')
print(strs_list)
実行結果
['str1', 'str2', 'str3', 'str4', 'str5']
帰ってくるのは分割された文字列のリストなので、一つずつ表示するにはfor文を使います。
for s in strs_list:
print(s)
実行結果
str1
str2
str3
str4
str5
これで文字列を分割して、一つずつ取得することができました。
C言語での文字列の分割:strtok
C言語での文字列の分割は、ヘッダーファイル「string.h」に含まれる「strtok関数」を用います。
#include <stdio.h>
#include <string.h>
int main(void)
{
char strs[] = "str1,str2,str3,str4,str5";
char *token = strtok(strs, ",");
while(token != NULL) {
printf("%s\n", token);
token = strtok(NULL, ",");
}
}
実行結果
str1
str2
str3
str4
str5
「#include <string.h>」でstring.hをインクルードし、「char strs[] = “str1,str2,str3,str4,str5”;」で分割する文字列を定義しました。
その文字列を「strtok(分割される文字列, 区切り文字)」で分割していきます。
しかしPythonのように分割後の文字列をリストで取得できるというわけではなく、分割した一番最初の文字列を取得するという関数のようです。
つまり「char *token = strtok(strs, “,”);」では「str1」を取得しています。
変数名tokenの前に*(アスタリスク)がありますが、これは次回勉強してみることにして、今回はこういうものだとしておきます。
2つ目以降の文字を取得するにはwhile文を使って、繰り返し処理をします。
「while(token != NULL)」では、区切り文字で分割できなくなったら「NULL」が返ってくるため、その「NULL」を検出することで文字列がこれ以上分割できないことを検知しています。
「printf(“%s\n”, token);」はこれまでにも何回も出てきた文字列の表示です。
そして忘れてはいけないのが「token = strtok(NULL, “,”);」。
strtok関数の第一引数(分割される文字列)にNULLを指定すると、前に分割した続きから再度分割するということになります。
つまり2回目の分割は「str2,str3,str4,str5」を分割するということになるわけです。
ちなみにこれを忘れると、永遠と最初の分割された文字(str1)が表示され続けるので注意です。
#include <stdio.h>
#include <string.h>
int main(void)
{
char strs[] = "str1, str2, str3, str4, str5";
char *token = strtok(strs, ",");
while(token != NULL) {
printf("%s\n", token);
}
}
実行結果
str1
str1
str1
str1
str1
str1
str1
(以下略)
何はともあれこれで文字列の分割をすることができました。
ただPythonの時と違うのは、分割はできたものの表示することにだけしか現状では使えていないことです。
本来ならば分割した文字列をリストに入れて、必要に応じて取り出しと言ったことがしたいのですが、まだC言語のリストに関しては勉強していません。
ということで近いうちにC言語のリストを勉強する必要が出てきました。
ただ次回は先ほど少し出てきた文字列の定義の際の*(アスタリスク)が何なのかを先に勉強していきたいと思います。
C言語のリストに関してはその後の回ということにしましょう。
ではでは今回はこんな感じで。
コメント