C 文字列 新しいページはコチラ
提供: yonewiki
(ページの作成:「※このページではC言語にも存在していたという意味で記事タイトルがC ポインタになっていますが、<br /> C++でも同...」) |
|||
6行: | 6行: | ||
例<br /> | 例<br /> | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
− | char c; //文字型の変数定義 | + | #include <iostream> |
− | c = 'a'; //aという文字を変数cに代入。実際にはaの文字コード番号が代入される。 | + | int main(){ |
+ | char c; //文字型の変数定義 | ||
+ | c = 'a'; //aという文字を変数cに代入。実際にはaの文字コード番号が代入される。 | ||
+ | std::cout << c << "\n"; | ||
+ | std::cout << std::hex << (int)c << "\n"; | ||
+ | return 0; | ||
+ | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | 出力結果 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | a | ||
+ | 61 //16進数の61は10進数では97です。asciiコードですね。 | ||
+ | </syntaxhighlight> | ||
+ | という具合に半角の1文字を扱うことができました。私たちは日本人なので日本語を使いますから、<br /> | ||
+ | 日本語を格納したりする変数を最終的には使いたいと思いますが、まずはこのasciiコードの範囲で<br /> | ||
+ | 1文字では文章が表現できないので、文字列の扱い方について覚える必要があります。<br /> | ||
+ | 文字列変数の配列として考えることで実現されます。<br /> | ||
+ | <br /> | ||
+ | C言語の面倒なところはこのあたりの厳密さ、多様性にあると自分は感じます。 | ||
+ | ここで記述するのは基本的なことだけになってしまいそうですが、文字列を変数に格納するという手法については<br /> | ||
+ | 多種多様の手法が存在しているので、文字列の理解をするだけでも大変です。自分でプログラムを全部組むのであれば<br /> | ||
+ | 一つのやり方を覚えればよいのですが、誰かが作ったプログラムを再利用する場合には、その多種多様な方法の中で<br /> | ||
+ | どの手法が使われるかは定まっていません。ですから、あらゆる事態に備えるのであれば、その多種多様な方法を<br /> | ||
+ | できるだけ網羅して理解する必要もあります。<br /> | ||
+ | 更には、文字コード群もいっぱいあるし、文字列関係の操作はプログラム技術全体の大きな領域になります。<br /> | ||
+ | <br /> | ||
+ | とは、いったものの覚えることが多すぎると嘆いても仕方ないので、ひとつづつ覚えてみる覚悟を決めましょう。<br /> | ||
+ | 文字列は以下のようにして変数を宣言したり、初期値を入力できます。<br /> | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | //★パターン1 | ||
+ | char cStr1[10] = {'y','o','n','e','w','i','k','i'}; //このやり方はあまり使うことは無いですけど、配列の基礎的な代入方法かも。 | ||
+ | //ちなみに配列の添え字は0から始まって9までが作られます。 | ||
+ | //cStr1[8]とcStr1[9]には自動的に"\0"が代入されます。 | ||
+ | //数字の0で初期化してくれるってこと。 | ||
+ | cStr1[10] = {'y','o','r','u','w','i','k','i'};//初期化以外ではまとめて代入する記述はできないので、これはエラー | ||
+ | |||
+ | //★パターン2 | ||
+ | char cStr2[10] = "yonewiki"; //このやり方は便利だね、文字型配列の優しさをちょっぴり感じます。 | ||
+ | //同じくcStr2[8]とcStr2[9]には自動的に"\0"が代入されます。 | ||
+ | //数字の0で初期化してくれるってこと。 | ||
+ | cStr2[10] = "yonewiki";//この方法でも初期化以外ではまとめて代入する記述はできないので、エラー | ||
+ | //でも以下のようにChar型の代入と同じやり方はできます。 | ||
+ | cStr2[2] = 'r'; | ||
+ | cStr2[2] = 'u'; | ||
+ | |||
+ | //★パターン3 | ||
+ | char cStr3[] = "yonewiki"; | ||
+ | //変数宣言時に値の代入(初期化)の記述があれば、配列の大きさを省略してもOK。 | ||
+ | //自動的にcStr3[0]からcStr2[8]までの9の大きさの配列が生成されて、cStr3[8]には自動的に"\0"が代入されます。 | ||
+ | //パターン1のような面倒な方法での値の代入(初期化)でも同じ結果になります。 | ||
+ | |||
+ | //★パターン4 | ||
+ | char cStr4[][9] = {"yonewiki","wiki"}; | ||
+ | //これは文字列の配列です。配列の大きさを明記した後ろ側の方が文字列の長さ。2つの文字列があるってのは自動で認識して | ||
+ | //cStr4[0][0~8] | ||
+ | //cStr4[1][0~8] | ||
+ | //といった変数が定義されたことになります。 | ||
+ | </syntaxhighlight> | ||
+ | と、まずは4つのパターンを示しました。<br /> | ||
+ | パターン3はいいよね。パターン4は応用です。だけどちょっと手抜きの手法なんです。<br /> | ||
+ | なぜかっていうと最初の文字列のyonewikiは大きさ9の配列にぴったり格納できて、最後一文字のcStr4[0][8]には"\0"も格納できる。<br /> | ||
+ | だけど2つめの文字列のwikiは大きさが5あれば十分でcStr4[1][5~8]は無駄に"\0"という文字のコードである値0が格納されてしまいます。<br /> | ||
+ | それででてくるのが、メモリの使い方を厳密に支配できるポインタって奴による処理になります。ややこしくてうんざりって感じる人も多い。<br /> | ||
+ | 今どきのPCには4GByteとか8GByteとかメモリつんでるんだし4Byteくらいでケチケチすんなよと思うプログラマもいるでしょう。<br /> | ||
+ | 小さな規模のアプリを開発している人にとってはその感覚って正しいと思います。でも、大規模なアプリを開発している熟練プログラマは<br /> | ||
+ | その小さな無駄を失くすことで資源を有効利用するし、動作速度の速いプログラムを提供しているわけで、それで飯を食ってる人もいる。<br /> | ||
+ | あの人に、あの会社に頼めば最大限有効活用した素晴らしいアプリケーションが作成されるという評価をもって、経済社会で争っているのです。<br /> | ||
+ | <br /> | ||
+ | そして、再利用可能なクラスやプログラムを提供している組織やプロジェクトでは、同じように資源の有効活用や動作速度の速いプログラムになるように<br /> | ||
+ | 組み込まれているので、自分は規模の小さいアプリしか作らないから覚えなくてもいいと思っているとしたら、その難しい部分を理解しようとしなかったばかりに | ||
+ | それらの有効な再利用すべきプログラムを使いこなすことに苦労することになるし、C言語の基礎は抑えたのになんだかわかった気分で<br /> | ||
+ | 満足して、より踏み込んだところへ行けずに終わってしまうケースにおちいっているのだと思います。自分も同じようなもんですが…<br /> | ||
+ | <br /> | ||
+ | というわけで、また一歩踏み込んでいきます。<br /> | ||
+ | それにしても文字列は初期化のときはあんなに簡単に代入できるのに、それ以降の代入では cStr = "yonewiki"; みたいにして代入できないのか?<br /> | ||
+ | 不便ですよね。<br /> | ||
+ | <br /> | ||
+ | そういった不便さも踏み込んでいけば一定の理解を得ることができると思います。<br /> | ||
+ | <br /> | ||
+ | 次はポインタを使った文字列操作についての記事を書こうと思います。なかなかやるきになんないすけどね。<br /> | ||
+ | 最近はMediaWikiの中に文字を打ち込む時間も多く取れてるので、更新していけるような気がする。でも今日はここまでかな。<br /> | ||
+ | <br /> | ||
+ | [[C PlusPlus|C++]]へ戻る |