第35講 10進数をn進数に翻訳する△ 
第9話 文字列から1文字ずつ取り出す

コード再掲
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           int a,n;
           a=int::Parse(textBox1->Text);
           n=int::Parse(textBox2->Text);
           a=520;
           n=2;
           textBox3->Text=f(a,n);
           String^ b;
           int m;
           b=textBox4->Text;
           m=int::Parse(textBox5->Text);
           textBox6->Text=g(b,m);
        }
        String^ f(int a,int n){
              ・
              ・
        }

        String^ g(String^ b,int m){
          int i,k,w=0;
          char s[25];
          for(i=0;i<25;i++){
            if(b[i]=='e'){
              k=i;
              break;
            }
            s[i]=b[i]-48;
          }
          for(i=0;i<k;i++){
            w+=s[i]*((int)pow((double)m,(double)(k-i-1)));
          }
          return(w.ToString());
        }

ポイントは、入力された文字列をからどのようにして1文字ずつ取り出すかです。
例えば、3254とtextBox5->Textに入力されている文字から、1文字ずつ3→2→5→4のよう取り出せればよいのです。
取り出しに成功したら、これが7進数であれば、
3×7の3乗+2×7の2乗+5×7+4とすればよいのです。
String^ b;のbのi文字目はb[i-1]で与えられます。
ですから
1文字目:b[0]
2文字目:b[1]
3文字目:b[2]
4文字目:b[3]
   ・
   ・
   ・
となっているわけです。ですから、for文で1文字ずつ取り出すことができます。
そして、本当は
3254?
の?のところに文字列の終了の印(例えば'\0')が決められているはずなのです。
しかし、前話で書いたとおりそれがわかりませんでした。
そこで、bのサイズを取得すればよいと考え、
k=sizeof(b)/sizeof(String^);
も考えましたが、
sizeof(b)はtextBox5->Textに何文字入れても4なのです。
sizeof(String^)も4ですから、k=sizeof(b)/sizeof(String^);は常に1になってしまって意味がありません。
私にもよくわかりませんが、String^型は固定文字列型で、サイズは4に固定さていて、
見かけだけ変更することによって123456789のようなものも表示できるようになっているようです。
ですから、
b=L"123456789";
と入力してもbのサイズは9にならず、4のままなのです。
サイズの取得方法か、文字列の最後がなんと定められているのかがわかれば、
妥協の産物eはいらなくなるのですが。




第8話へ 第36講第1話へ


戻る

VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)