スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

友人との何気ない会話から

C言語ではString型が使えないよね~、とラーメン店で友人たちと会話していたところ、C言語でそれっぽく実現できるのかなぁ? と疑問が生まれたので、試しにまずは構造体でそれっぽくプログラムを書いてみようじゃないか!

なお、include文は省略します。

typedef struct string{
char text[];
}string;

int main(void){
string a;
a.text = "abc";
printf("%s",a.text);
return 0;
}


まぁ、一般的な感覚でこんなコードを打ってコンパイルしてみる! a.textってやってる時点でStringじゃないだろ! ってツッコミがくると思いますが(;´∀`)

c:2: error: flexible array member in otherwise empty struct


お、なんかエラーが出てきたぞ。
エラーから予測すると、構造体の中に char[] は使えないようだ。
ならば、charをポインタでやってみよう! と思って、次のコードを書く

typedef struct string{
char *text;
}string;

int main(void){
string a;
a.text = "abc";
printf("%s",a.text);
return 0;
}


コンパイルをしてみると、・・・おぉ、コンパイルが通った(`ω´) で、作られたファイルを実行すると

abc


・・・何だ、あっという間じゃないか(;´∀`)

しかし、ここで阿呆なことに気づく。
「charにtypedef使えば、構造体いらないですよね~!(;・∀・)」
わざわざtypedefを使ってるくせに、何故か気づかないという・・・。もう、ホントに申し訳ありませんm(_ _)m

長くなるため、続きからお読みください。

では、typedefで早速書き直してみる

typedef char* string;

int main(void){
string a;
a = "abc";

printf("%s",a);
return 0;
}


早速、コンパイル・実行をしてみる

abc


(・∀・)イイネ!! 
ここで注意しないといけないのは typedef の中の char* をうっかり()でくくったり(キャスト化)、スペースを置いたりするとエラーが大量に出ます(;・∀・) もちろん、typedef char stringでもよかったんですが・・・。
「それだと、ただのcharと動作が変わらんじゃないか!?」

そして、この勢いでstringの二次元配列にも挑戦してみよう! と思って、いそいそと書き直した結果が下記のコード

typedef char** string;

int main(void){
string a;
a = (string **)malloc(sizeof(string *)*128);
a[0] = "abc";
a[1] = "edf";

printf("%s\n",a[0]);
printf("%s\n",a[1]);
return 0;
}



そして、実行をしてみた結果

abc
edf


多次元配列になっても、この要領でmallocを駆使していけば実現できそうだな~。
これで終わり・・・! と思ったら、最後に重要な確認をすることを忘れていました。
string型を定義したのはいいものの、string.hなどの文字列ライブラリ関数で利用できなくなっては意味がない・・・!!(ここらはstring型うんぬんじゃなく、typedefの定義の話になってきそうですが)
というわけで、確認するために下記のコードを書いてみた

typedef char* string;

int main(void){
string a,b;
a = "abc";
strcpy(b,a);
printf("%s\n",a);
printf("%s\n",b);
printf("%d\n",strlen(a));
return 0;
}


実行結果が次の通り

abc
abc
3


問題なさそうですねっ!(・∀・)
というわけで、C言語でstring型を実現してみましたが・・・まぁ、利点は視覚的に優しいと言ったところでしょうか(;´∀`)
恐らくポインタを理解されてる型はchar*型をそのまま使うだろうし、・・・うーむ。
まぁ、雑談から生まれた疑問だったので、ここまで考察すれば十分ですよね!w
スポンサーサイト

コメント

Secret

プロフィール

朔夜だったり、シェルジュだったり

Author:朔夜だったり、シェルジュだったり
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。