HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0907
bensan一文字ずつ区切るには?15解決


bensan

リンク

2011/9/7(Wed) 22:45:32|NO.41206

初めまして。突然ですが、気になることがあったので質問させていただきます。

sdim bun,5 bun="プ","ロ","グ","ラ","ム" prix=0 foreach bun prix+=ginfo_mesx pos prix,0 mes bun(cnt) wait 50 loop
 このようなスクリプトのとき、2行目のような感じで、一つの文章を一文字ずつ
配列として区切りたいわけです。
 例:"プログラム"→"プ","ロ","グ","ラ","ム"

 既出の場合は、リンク先をお願いします。
どなたでもいいので、回答よろしくお願いします。



この記事に返信する


k5342(塾より帰宅

リンク

2011/9/7(Wed) 22:49:32|NO.41208

質問者の意図が良く読み取れなかったんですけど
1つの変数から分けるってことなんだろうか...?
違う気がしますけどw

sdim bun,5
buf="プ,ロ,グ,ラ,ム" split buf,",",bun prix=0 foreach bun prix+=ginfo_mesx pos prix,0 mes bun(cnt) wait 50 loop

すいませn。出来れば詳しく説明願います。



bensan

リンク

2011/9/7(Wed) 22:59:08|NO.41210

>k5342さん
ああ、なるほど。そういう書き方もできますね。

なんか自分勝手ですが、もう少し欲張ると、
"プログラム"という文字列が代入された変数を
(0)="プ"
(1)="ロ"
(2)="グ"
(3)="ラ"
(4)="ム"
の様な配列変数にしたいわけです。
無理でしたらすいません。
あと、最初の行のインデントが無いのは僕のミスです。



774

リンク

2011/9/7(Wed) 23:00:46|NO.41211

> k5342
塾より帰宅 とか夏休みがどーとか、何それ?
つっこんで欲しいのか?
この掲示板はブログや日記、twitter じゃねーっつの



k5342

リンク

2011/9/7(Wed) 23:05:58|NO.41214

>>No.41211
>>774さん
あ、すいません
以後気をつけます。

>>No.41210
strmidを駆使するというのはどうですか?
出来なくはないと思います。



とおりすがり

リンク

2011/9/7(Wed) 23:17:09|NO.41217

こういう事でしょうか。

sdim bun,10 sdim moji,2,5 bun = "プログラム" val = strlen(bun) mes "もとの文字列="+bun+"("+val+"bytes)" index = 0 repeat val if index >= val : break moji.cnt=strmid(bun,index,2) mes "半角" + index + "文字目から全角1文字を取り出す="+moji.cnt index += 2 wait 1 loop stop
半角文字2つ分で全角1文字と数えることに注意してください。

HSPアシスタントを起動すると沢山のサンプルスクリプトを見る事が出来ますが、
お探しの件は「basic」フォルダの「strmid」の項でヒントを見つける事が出来ます。
上のスクリプトはサンプルを改変した物です。



bensan

リンク

2011/9/7(Wed) 23:33:29|NO.41219

>とおりすがり さん

そのスクリプトの通りです!
strmidという便利な命令があったんですね、知りませんでした。
ヘルプとかを参考にしながら頑張ってみたいと思います。
皆さんありがとうございました。



GENKI

リンク

2011/9/8(Thu) 00:48:29|NO.41225

やっぱりこの手は無しですよね?w

#include "hsp3util.as" text 500 emes "プログラム"
すみませんマジメにやります。
簡単な切り分けのサンプルを書いてみました。
例1と2の2パターン用意してみました。どちらか片方動かすときは片方はコメントにしておいてください。

sdim b,2,5 a = "プログラム" repeat 5 ;例1 b(cnt) = strmid(a, cnt*2, 2) ;例2 ;wpoke b(cnt), 0, (wpeek(a, cnt*2)) loop ;表示してみる。 repeat 5 mes b(cnt) loop
ただしこのサンプルでは2バイト文字の場合しか考慮していません。途中に半角文字が入ると文字化けを起こします。

対策は2バイト文字を判定して、配列変数に1バイト格納するか2バイト格納するか場合わけすることです。
判定はこちらの資料を参照下さい。
資料:2バイト文字の判定
http://hspdev-wiki.net/?String%2F%B2%FE%B9%D4#o681c775



bensan

リンク

2011/9/8(Thu) 19:07:46|NO.41242

>GENKI さん

あああ!なんだこんな簡単のがあったんだ!知りませんでした…
参考資料のリンクもありがとうございます。



Cookies

リンク

2011/9/8(Thu) 19:28:49|NO.41244

ずっと前のこの掲示板のスレで、
2バイト・1バイト関係なしにできるように、
一度Unicodeにするというのがありましたねぇ。
あれを知ったときは感動でした。

ということで。

sjis="くぁwせdrftgyふじこlp;" //元の文字列 uni="" //Unicodeに変換した文字列 cnvstow uni, sjis //変換 i=0:repeat //$0000を探す。(文字数調べ) if wpeek(uni,cnt*2)=$0000 : break i++ loop sdim result_uni, , i //文字数がiに入っているため、その分配列を確保。 repeat i wpoke result_uni(cnt), 0, wpeek(uni, cnt*2) //それぞれの要素にコピー。 loop sdim result, , i //sjisの分割結果格納変数 foreach result_uni result(cnt)=cnvwtos(result_uni(cnt)) //それぞれの要素をSJISに変換。 loop foreach result //結果を出力。 mes ""+cnt+":"+result(cnt) loop
Unicodeの文字数を調べるのに$0000を探すという方法しか思いつかなかったのですが。
もっと効率的なやり方がある気がします。
スクリプトが相変わらずわかりにくくてすいません。



Cookies

リンク

2011/9/8(Thu) 20:07:34|NO.41251

あるところからの情報で、Unicodeの文字数は

#uselib "msvcrt" #cfunc strlenW "wcslen" var
としてからstrlenW関数で調べられるとのこと。


#uselib "msvcrt" #cfunc strlenW "wcslen" var sjis="くぁwせdrftgyふじこlp;" //元の文字列 uni="" //Unicodeに変換した文字列 cnvstow uni, sjis //変換 i=strlenW(uni) sdim result_uni, , i //文字数がiに入っているため、その分配列を確保。 repeat i wpoke result_uni(cnt), 0, wpeek(uni, cnt*2) //それぞれの要素にコピー。 loop sdim result, , i //sjisの分割結果格納変数 foreach result_uni result(cnt)=cnvwtos(result_uni(cnt)) //それぞれの要素をSJISに変換。 loop foreach result //結果を出力。 mes ""+cnt+":"+result(cnt) loop
で。



とおりすがり

リンク

2011/9/8(Thu) 22:47:59|NO.41253

とても勉強になりました。



who

リンク

2011/9/8(Thu) 23:01:34|NO.41254

>>774さん
別に怒ることではないと思いますが。
>>Cookies(Kookies)さん
wcslenってmsvcrtだったの。しらなかった。



XBG|YAMANOTE231103(PC)

リンク

2011/12/15(Thu) 22:37:34|NO.43784

>つっこんで欲しいのか?
>この掲示板はブログや日記、twitter じゃねーっつの

この掲示板はそうやって突っ込むところ“でも”ありません。
第一twitterにもそんな一言だけ書き込むのってさみしいし;;



ORZ

リンク

2011/12/16(Fri) 00:07:54|NO.43785

ンか月も前のスレッドに何をやっとるんだ?



GENKI

リンク

2011/12/16(Fri) 01:52:20|NO.43790

数時間前にいくつかスパム投稿がありました。スパムは既に削除されています。(迅速な対応に感謝。)
しかし、これに伴い被害を受けたいくつかの古いスレッドが上にあがってきています。

皆様、レスするときはご注意下さい。





と、上がってきた古いスレに書き込んでみる。(`・ω・´)



ONION software Copyright 1997-2023(c) All rights reserved.