#pragma twice

KAB-studio > プログラミング > #pragma twice > 201 Version 11.01 文字列ってなんだっけ

#pragma twice 201 Version 11.01 文字列ってなんだっけ

前のページへ 表紙・目次へ 次のページへ

 Version 11.01
文字列ってなんだっけ

というわけで、今回からは文字列編に入ります
なんか地味〜な感じねー
でも、本当に重要で、きっと役に立つから
はいはいはい。で?
で、まずは下準備から。新しく MFC のプロジェクトを作って
 MFC なの?
今回は文字列の勉強だけだから、 MFC 使った方が楽でしょ
確かに、わざわざあの長ーいの用意するのは大変よね……
 MFC には TRACE() もあるし
【新規作成】で MFC AppWizard (exe) っと、プロジェクト名は?
プログラムの世界では文字列は string って言うから
じゃー StringTest っと
テストアプリを作るのと同じようにして
じゃあダイアログね
テストアプリの作り方については Version 4.01 ( No.051 ) を参照して
ください
プロジェクト作って、ボタン置いて、ハンドラ作ってと

////////////////////////////////////////////////////////////////
//  1番目のテスト。

namespace B1
{

void Test()
{

}

}   //B1


void CStringTestDlg::OnButton1() 
{
    B1::Test();
}

って感じになればいいんだよね
そうそう。さて、では文字列について復習していきます。文字列について
は Version 5.04 ( No.069 ) で説明したとおり
うん、前に教わった
その中でも重要な部分について振り返ってみます。まずは文字から

void OutputChar()
{
    TRACE( "%d, 0x%X\n", 'A', 'A' );
    // 65, 0x41
}

あ、ちなみにここからは呼び出す関数だけ書くからね。たとえばこの例だ


////////////////////////////////////////////////////////////////
//  1番目のテスト。

namespace B1
{

void OutputChar()
{
    TRACE( "%d, 0x%X\n", 'A', 'A' );
    // 65, 0x41
}

}   //B1


void CStringTestDlg::OnButton1() 
{
    B1::OutputChar();
}

っていうふうに呼び出されていると考えてください
はーい。えっと、これは A って文字を数字で出してるんだよね
そう。文字は '' で囲むと整数値になります。 A は10進数だと 65 、
16進数だと 0x41 になります
なんで10進数と16進数両方出してるの?
とりあえずわかりやすいのは10進数かと思って。ただ、文字列の世界で
は16進数で表現する方が多いから、これからは16進数で書くね
はーい
で、この A が 0x41 だ、っていうのは本当は間違い
へ?
実は逆で、 0x41 って数字が A って文字に変換されてるんです。数字が
先にあるってこと
つまり A → 0x41 じゃなくて、 0x41 → A ってこと?
そういうこと。これはとっても大事なことだから
そんなに?
そんなに。もう少ししたら教えるから。で、話を戻すと、この文字が並ん
でいるのが文字列

void OutputString()
{
    char ch[] = "ABC";
    TRACE( "%s, 0x%X\n", ch, ch );
    // ABC, 0x12F6B0
}

こうするとことで配列が作られて、その中に ABC が入ります
あと \0 も入るんだよね
そうそう。だから全部で4文字になります。で、これは実際にメモリを見
てみるのが一番
メモリウィンドウを開くんだよね
その前にブレークポイント置かないと。 } の所にブレークポイントを置
いて、そこで止めてから、メモリウィンドウに 0x0012F6B0 を入れてリター
ンすると

0012F6B0  41 42 43 00 (略)  ABC..(略)

 41 がさっきの A の文字だね。で、 42 が B 、 43 が C 、 00 が \n 
だね
文字列が何かわからなくなったら、メモリウィンドウを見てみるといいか
も。 VC にはこういう便利なものがあるんだから
これだとすぐわかるもんね
では次。さっきの

    char ch[] = "ABC";

だけど、これは〈 ABC\0 が入る配列を作って、その中にコピーしろ〉
ってこと
うん
つまり、これだと3文字分、 \0 も含めれば4文字しか入らない配列が作
られちゃいます
ってことは、それより長い文字列は入らない!
配列はサイズを自由に広げられないから
なんでだっけ、それ
さっきメモリのイメージを思い出して。配列の右側に
他の変数があったら広げられない……ってこと? じゃあ別の所に長ーく
取り直せばいいじゃん
それが CString とかってこと
あー
そういう CString とかの機能は〈可変長文字列〉って言って自由に文字
列の長さを変えられるんだけど、それはも少し先ってことで、ここでは配列
を大きめに取って対処します

void CharArray()
{
    char ch[256];
    strcpy( ch, "ABC" );
    TRACE( "%s, 0x%X\n", ch, ch );
    // ABC, 0x12F5B4
}

まず256文字分の配列を確保して、そこにランタイムの strcpy() で文
字列をコピーします
これならあとでもっと大きな文字列も入れられるってわけね
メモリ的にはこうなってます

0012F5B4  41 42 43 00 CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC
(以下、 CC が続く)

うわ、なんか CC がいっぱい入ってる!?
これは OS とかによって違ってくるから、こうならない場合もあるから
こうならないって?
普通、変数は場所を確保するだけだから、確保する前のメモリの状態その
ままってこと
前に使った状態そのままってことね
プログラミング用語でそういうのを【ゴミ】って言います
ゴミ……
この変数、初期化してないからゴミが入ったままだ、とかね
初期化?
変数になにかの値を入れておくこと。文字配列だとあまり必要ないけど、
整数値とかだと重要かな。たとえば

void OutputNoInit()
{
    int i;
    TRACE( "%d\n", i );
}

あ、ビルドしたら警告出た

warning C4700: 
値が割り当てられていないローカルな変数 'i' に対して
参照が行われました。

この場合、 i は変数の領域を確保しただけだから
それまでメモリにあったのがそのまま残ってる、つまりゴミが入ってる
ってわけね
そう。だから、これを初期化します

void OutputInit()
{
    int i = 0;
    TRACE( "%d\n", i );
    // 0
}

なるほどねー。って文字列から離れちゃったじゃん
う”。まぁ文字列についての復習はできたから大丈夫。うん、大丈夫
……

/*
    Preview Next Story!
*/
ほんっとーに地味な復習ねー
まぁ実際はそれほど重要じゃないかもね
え、そうなの?
慣れちゃえば特に気にせず使えるようになるから
……それって危なくない?
……
……なに?
ううん、なんでも。というわけで次回
< Version 11.02 ファイル名を抜き出してみよう >
につづく!
いやぁ……なんかここまで来たんだなぁって……ううっ
泣いてる!?
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。