• ベストアンサー

文字の連結

str1~9まで任意の文字列が入ります。 str1=あああ str2=いいい のような感じです。 これをfor文で連結させたいのですがうまく値がはいりません。以下のソースなのですがどのようにすればいいでしょうか? for(var i:Number = 1; i <= n; i++){ var a; a = this["a"] + this["str"+i]; } trace(a); 最終的にaにはあああいいいううう・・・というような文字列を入れる予定です。

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

作業用の変数 a を for ループの中で定義すると、ループのたびに初期化され、前に入っていた内容が消えてしまいます。 前の a の内容を維持しながら文字列を追加していくには、a を for 文の”外で”定義し、ループに入る前に1度だけ初期化します。 スクリプトの一例です。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください) /**************************************************/  //連結する文字列の総数  var n:Number = 3;  //文字列のサンプル  var str1:String = "あああ";  var str2:String = "いいい";  var str3:String = "ううう";  //連結処理  var a:String = "";  for( var i:Number = 1 ; i <= n ; i++ )  {   a += this[ "str" + i ];  }  //動作確認  trace( a ); /**************************************************/ "" は空っぽの文字列を表します。 つまり、変数 a には最初は”文字が1文字もない文字列”が入っています。 a を for 文の外で定義しておくと、ループ内では a が初期化されず、ループ前の内容がそのまま残ります。 あとは for ループ内で a と変数をつなぐ処理をするだけで、1回目のループで a の初期値である空っぽの文字列+ str1 で "あああ" 、2回目のループでは先のループでできた "あああ" に str2 を追加して "あああいいい" ・・・というように、前の文字列を維持しながら次々と文字列を連結していくことができます。 ちなみに、文字列の連結にも数値と同様に” += ”演算子が使えます。 意味は  a = a + this[ "str" + i ]; と同じですから、代わりにこのように書くこともできます。

dcx147
質問者

お礼

お返事ありがとうございます。おかげ様でうまく動作させる事ができました。 for文で以下のように変数を定義する場合なのですが var str1:String = "0"; var str2:String = "0"; ・・・ このような事をfor内で実現するにはどうすれば可能でしょうか? var this[ "str" + i + :String] = 0; のようにしてみたのですがうまく動作しないようです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • DPE
  • ベストアンサー率85% (666/776)
回答No.2

#1です。 for ループと [ ] を利用して変数を定義する場合は、型の明示をなしにして  this[ "str" + i ] = "0"; とすればエラーにならず、変数も定義されます。 var は、他の階層にある変数( this.str1 のように、実は自分のものだがターゲットパスを記述する場合なども含む)には付けられないことになっています。 [ ] で動的に変数を作る場合は必ず左側にターゲットパスを書かなければならないため、var を付けるとエラーになってしまいます。 しかし、変数の型を明示する” : ”演算子は、var と一緒でなければ使用できません。 つまり、for ループと [ ] で動的に変数を作る場合、型の明示はできないのだと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • strstrを利用しない文字列検索について

    キーボードから入力した文字列 str に対し, This is~の文字列中に str が出現するかどうかを判定して表示するプログラムを作成したいのですが、うまくコンパイルができません。 条件ですが、、、 ・forループを利用し、0文字目、1文字目と順に検索していく ・strstr関数およびstring.hを利用しない です。このプログラムをいじって教えてほしいです。 ややこしくて答えづらい質問かと思いますが、有識者の知恵を拝借したいです。よろしくお願いします。 #include <stdio.h> int main(void) { char str[256]; char s[] = "This is a pen. That is an apple."; int i,j,k,checker; printf("This is a pen. That is an apple.\n\n"); gets(str); for(j=0;j<256;j++) { for(i=j,k=0;str[k]!='\0';k++,i++) { if(str[k]==s[i]) { checker=1; } else { checker=0; } } } if(checker==0) { printf("NG!その文字列は含まれていません。\n"); } else { printf("OK!その文字列は含まれています。\n"); } }

  • 特定の文字列で連結して返す関数

    String.prototype.connect=function(){ var connectString=this,text=''; foreach(arguments,function(){ //for(var i in arguments){}とfor(i=0;i<i.length;i++){}を使い分けされています if(text){ text+=connectString; } text+=this; }); return text; }; このように、thisに指定された文字列で、引数にある文字列を連結する関数を作ったのですが、 例: ' - '.connect('a','b','c'); ->a - b - c 配列などを渡した場合も表示したいのですが、typeof this=='object'で確認し、foreach(this,function(){/*~*/}); だと、その配列の中に更に配列がある場合、もう一度チェックし、foreachをやらなければなりません。 これではキリがないので、どうしたらいいでしょうか? arguments.calleeや、whileなどでどうにかしようと思いましたが、難しくて出来ませんでした>< やりたいことは、こうです↓ 'or'.connect('あ',['い',['う','え','お'],'か',['き'],['く','け'],'こ','さ'],'し','す','せ',[[['そ']][['た','ち','つ','て','と']]]); ->あorいorうorえorおorかorきorくorけorこorさorしorすorせorそorたorちorつorてorと 複雑かもしれませんが、お力をお貸しくださいm(_ _)m

  • vb6のstringについて256文字以上連結

    Dim str as String Dim intloop as Integer For intloop=0 TO 19 str=str+"work joint“+intloop Next intloop 20個分の文字列が連結されません。 どのようにすればよろしいでしょうか?

  • sprintf()の使用方法

    先日から仕事で別の人が作ったソースを見ることになりました。 文字列連結を繰り返す処理でこんなコードが書いてありました。 char str[4096]; for(;;) {      /* 具体的な条件などは忘れました */ sprintf(str, "%s%s", str, var1);   /* 一応、var1はstrに対して十分小さな文字列。*/                      /* 繰り返しが終了するまで溢れることはないのですが */ } strcatなどを知らない人が作ったのでしょう。 一応、目的は達しているし、動いているみたいだからいいと言えばいいのかもしれないですが、なんか気持ち悪い。 こういうコードで何か問題はないのでしょうか?

  • C言語で分からないところがあるのですが

    すみません。C言語のポインタで分からないことがあって来ました。 ポインタの理屈は理解してはいるのですが、いざソースコードを書いてみようということになると全く手がつけられずにいます。 以下のソースコードですが、strlen()と同じ働きをする関数mystrlen()と、strcmp()と同じ働きをする関数mystrcmpを、ポインタを使って作成するものです。どこをどうすればいいのか教えてくださいませんか。 #include <stdio.h> int main(void) { char str1[80], str2[80]; int i, j; int len1, len2; printf("第1の文字列を入力してください: "); gets(str1); printf("第2の文字列を入力してください: "); gets(str2); /* * 文字列の長さを確認する */ /* NULL文字(文字列の最後)まで読み飛ばす */ for (len1 = 0; len1 < 80 && str1[len1] != '\0'; len1++) ; /* ループ終了後、len1 に文字列の長さが入っている */ if (len1 < 80) { printf("%s は %d 文字の長さです\n", str1, len1); } else { printf ("第1の文字列が80字以上あります\n"); } /* str2 についても同様 */ for (len2 = 0; len2 < 80 && str2[len2] != '\0'; len2++) ; if (len2 < 80) { printf("%s は %d 文字の長さです\n", str2, len2); } else { printf ("第2の文字列が80字以上あります\n"); } if (len1 < 80 && len2 < 80) { for (i = 0; i < 80 && str1[i] != '\0' && str2[i] != '\0' && str1[i] == str2[i]; i++) ; if (str1[i] == str2[i]) { /* 両者同時に == '\0' のはず*/ printf("文字列は等しい\n"); } else if (str1[i] < str2[i]) { /* str1[i] == '\0' のはず*/ printf("%s は %s より小さい\n", str1, str2); } else { /* str2[i] == '\0' のはず*/ printf("%s は %s より大きい\n", str1, str2); } } /* * 十分なスペースがあれば、str2をstr1の最後に連結する */ if (len1 + len2 < 80) { /* str1 の末尾を探す */ for (i = 0; str1[i] != '\0'; i++) ; /* ループを抜けた段階では i は len1 と同じはずなので、 上記のループを作らず、i の代わりに len1 を用いるのも可 */ /* それ以降に str2 の中身をコピーする */ for (j = 0; str2[j] != '\0'; j++) { str1[i+j] = str2[j]; } str1[i+j] = '\0'; printf("%s\n", str1); } else { printf ("文字列をつなげた長さが80字以上あります\n"); } /* * str2をstr1にコピーする */ if (len1 + len2 < 80) { for (i = 0; str1[i] != '\0'; i++) { str1[i] = str2[i]; } str1[i] = '\0'; printf("%s %s\n", str1, str2); } return 0; }

  • 文字の連結について

    いつもお世話になっております。また作業が詰まってしまいましたので質問させて頂きます。 やりたい事は、Q列に入っている文章に条件を満たす文字(例:決済済み)が入っていれば、W列に入っている文字の後ろに「決定」という文字を追記したい。 ※「決済済み」の文字の前には必ず2文字何かしらの文字が含まれますがいつもきまっている文字ではありません。 A~Z列までデータが入っているシートです。 1、Wの後ろに1列新規追加(空白のX列を作成) 2、Q列の文字条件を満たしていればX列に「決定」と入力 3、すべてチェックが終わったらWとX列の文字を連結してW列に反映してX列を削除する。 というやり方にしようかとマクロを組んでみたのですが、3がどうしてもうまく行かずに悩んでおります。 ヒントを頂ければ幸いです。 以下は抜粋したマクロです。(実際は前と後ろに長いマクロが存在しております。) Columns("X:X").Insert Shift:=xlToRight Const i As String = "Q" Dim j As Long With ActiveSheets For j = .Cells(65536, i).End(xlUp).Row To 2 Step -1 If Mid(Range(i & j), 2, 4) = "決済済み" Then Range("X" & j) = "決定" End If Next j End With 連結に「&」を使う事はわかるのですがどうしても連結してくれません。 以上、よろしくお願いいたします。 環境はWindowsXP Excel2003です。

  • JavaScript内の文字を連結したい

    jQueryを使っています。 「$(this).attr("id");」でidの値を取得し、それを下記の「あああああ」部分に展開して連結をさせたいですが、どうやったらいいかわかりません。 $(function(){  $("a").click(function() {   var flashvars = {};   var params = {    scale:'noScale',    salign:'lt',    menu:'false',    allowfullscreen:'true',    flashvars:'programId=あああああ&dispMode=outer'   };  }); }); idが「004」だとするなら 「flashvars:'programId=004&dispMode=outer'」と連結したいです。 よろしくお願いします。

  • 全角文字の判定

    現在C言語を勉強しております。 そこで、キーボードから入力された文字列のチェックを行う関数を作成したいのですが、実装方法が分かりません・・・。 以下に仕様と私の作成したソースを貼ります。 【許可する文字】は、 全角のひらがな 全角の英語(大文字も小文字もOK) 全角の数字 です。 チェックする関数を作成したいのですが、以下ではうまくいかず・・・ 教えてくださいorz 比較の仕方がおかしいでしょうか? 関数は、引数として渡された文字列に許可以外の文字が含まれている場合は1を、そうでなければ0を返す、という仕様にしたいです。 int checkName(char *str) { int i; for(i = 0; str[i] != '\n'; i++){ /* 奇数バイトをチェック */ if(str[i] == 0x82){ i++; /* ひらがなの場合 */ if(str[i] >= 0xa0 && str[i] <= 0xf1) printf("ひらがな\n"); return 0; /* 英語(大文字)の場合 */ if(str[i] >= 0x60 && str[i] <= 0x79) printf("英語大\n"); return 0; /* 英語(小文字)の場合 */ if(str[i] >= 0x81 && str[i] <= 0x9a) printf("英語小\n"); return 0; /* 数字の場合 */ if(str[i] >= 0x50 && str[i] <= 0x58) printf("数字\n"); return 0; } return 1; } return 0; } 以上、よろしくお願いいたします。

  • C言語プログラミング 初心者

    現在2つの文字列を比較するstrcmp()関数と同じ動作をするプログラムを制作しています。 もちろん、strcmp()は一切用いません。 何とか作ってみたものの、文字列が等しいときなどにはうまく作動しません。 分かる方アドバイスお願いします。 以下のプログラムでは2つの50文字以下の文字列を入力することを想定しています。 #include<stdio.h> int main(void) { char str1[50],str2[50]; int a,b,i; printf("第1の文字列を入力してください: "); gets(str1); printf("第2の文字列を入力してください: "); gets(str2); /*文字列の長さを確認します*/ for(a = 0;str[a];a++) ; for(b = 0;str2[b];b++) ; printf("%s ha %d mozinonagasadesu\n",str1,a); printf("%s ha %d mozinonagasadesu\n",str2,b); /*文字列を比較します*/ for(i = 0;;i++){ if(str1[i] > str2[i]) printf("%s は %s より大きい\n"str1,str2); else if(str1[i] < str2[i]) printf("%s は %s より小さい\n"str1,str2); if(str1[i] > str2[i] || str1[i] <str2[i]) break; } for(i=0;str1[i] && str2[i];i++) if(str1[i] == str2[i] ) printf("文字列は等しい\n"); /*上のプログラミングだとstr1がaab、str2がaacのときも文字列が等しいと表示してしまうので、ぴったり等しいときのみ表示するにはどのように条件付けしたらよいでしょうか?*/ return 0; } ちなみにstr1[0]=a ,str1[1]=b, str2[0]=a, str[1]=b, str[2]=cが格納されていた場合、str1 < str2になると思うのですが正しいでしょうか? もし正しければこの場合str1[2]にはヌル文字が入っており、それがstr2[2]のcと比較されたためなのでしょうか? いろいろと質問してしまいましたが、分かる方解答お願いします。

  • 作ったプログラミングC何だけど、評価していただけませんが?不足があれば、教えてください!

    文字列「abc」の各アルファベットを1文字ずらすと文字列「bcd 」になり、 文字列「nisidate」の各アルファベットを2文字ずらすと文字 列「pkukfcvg」となる。さらに、 文字列「kibishii」の各アルファベットを2文字ずらすと文字 列「mkdkujkk」となる。 このような、任意の文字列の各要素を任意の文字数ずらすプロ グラムを作成する、なお、zを1文字ずらしたとき のアルファベットはaとする。 #include <stdio.h> #include <string.h> int main(void) { char str[27]="abcdefghijklmnopqrstuvwxyz",str1[50], str2[50]; int x,i,j,len; printf("文字列を入力---> "); scanf("%s", str1); printf("何文字ずらすかを入力---> "); scanf("%d",&x); len=strlen(str1); for(i=0;i<len;i++) { for(j=0;j<27;j++) { if(str1[i]=='z') { str2[i]=str[x-1]; } if(!(str1[i]=='z')) { if(str1[i]==str[j]) { str2[i]=str[j+x]; } } } } printf("%d文字ずらした文字列は%sです\n", x, str2); return 0; } よろしくお願いします!!