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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0731
薄荷1文字目取り出し6未解決


薄荷

リンク

2010/7/31(Sat) 21:53:10|NO.34156

1文字目を取してその文字を調べ
\だったら\を抜いて表示する方法がわかりません

a="\123" b=strmid( a , 0 , 1 )

ここまでしかわかりません
よろしくお願いします



この記事に返信する


info

リンク

2010/7/31(Sat) 22:12:55|NO.34157

こんな感じでしょうか?


a="\\123" b=strmid( a , 0 , 1 ) if b = "\\" { c=strmid(a,1,strlen(a)) mes a mes b mes c }

ちなみに[ \ ] は文字列操作の上で特殊な記号となっていますので、スクリプトから指定するときは
"\\" の様にする必要が有ります。
特殊な記号について詳しく知りたい場合は、プログラミングマニュアルの文字列の項を読んでみてください。



f3d

リンク

2010/7/31(Sat) 22:14:40|NO.34158

いろいろ間違っているかも。

"\"という文字はエスケープシーケンスとして使われるため、
"\"自体を表示したい場合は"\"ではなく"\\"と表記しなければなりません。

"\123"は"\1"というエスケープシーケンスがないため"\"は無視され、
変数aには"123"が代入されています。


a = "\123" mes a

もしa = "\\123"の場合

a = "\\123" if instr(a,0,"\\")==0{ mes "結果 = "+strmid( a , 1 , 2147483647 ) }



薄荷

リンク

2010/7/31(Sat) 22:23:19|NO.34159

詳しい解説ありがとうございます



Sucret

リンク

2010/7/31(Sat) 23:45:36|NO.34160

一文字だけ取り出す方法ならpeek関数を使用してはいかがでしょうか?


a = "\\123" if peek(a,0) = '\\' { mes"1文字目は\\です" mes strmid(a,1,strlen(a)-1) } else { mes a }

こんな感じでしょうか、peek関数では1文字を1バイトのデータとして取り出します。
それを判定するには調べたい半角一文字をシングルクォーテーション(')で囲みます。

微々たる差でしょうがpeek関数はstrmid関数より処理時間が約半分でした。
以下、百万回繰り返してやっと差が出るくらいなので作る物によってはあまり気にする必要は無いと思いますが・・・。

#uselib "winmm.dll" #cfunc timeGetTime "timeGetTime" a = "\\abc" time = timeGetTime() repeat 1000000 if strmid(a,0,1)="\\": continue await 0 loop mes "strmid = " + ( timeGetTime() - time ) + "ミリ秒" time = timeGetTime() repeat 1000000 if peek(a,0)='\\': continue await 0 loop mes "peek = " + ( timeGetTime() - time ) + "ミリ秒"

少しでも解決の手助けになれれば幸いです、製作頑張ってください。



薄荷

リンク

2010/8/1(Sun) 22:30:42|NO.34183

ありがとうございます
参考にさせていただきます



test

リンク

2010/8/2(Mon) 14:14:48|NO.34193

文字列の先端・終端またはその両方から指定した文字を取り除く、strtrim関数があります。
a="\\123"
aa = strtrim(a,1,'\\') mes aa
Sucretさんのスクリプトを借りて、取り除くところまで含めて計測してみました。
#uselib "winmm.dll"
#cfunc timeGetTime "timeGetTime"
//strmidで判定してstrmidで抜き出す
time = timeGetTime()
repeat 1000000
a = "\\abcdefghijklmnopqrstuvwxyz"
if strmid(a,0,1)="\\"{
a=strmid(a,0,strlen(a)-1)
continue
}
await 0
loop
mes "strmid = " + ( timeGetTime() - time ) + "ミリ秒"

//peekで判定してstrmidで抜き出す
time = timeGetTime()
repeat 1000000
a = "\\abcdefghijklmnopqrstuvwxyz"
if peek(a,0)='\\'{
a=strmid(a,0,strlen(a)-1)
continue
}
await 0
loop
mes "peek = " + ( timeGetTime() - time ) + "ミリ秒"

//peekで判定してmemcpyで抜き出す
time = timeGetTime()
repeat 1000000
a = "\\abcdefghijklmnopqrstuvwxyz"
if peek(a,0)='\\'{
len=strlen(a)
memcpy a, a, len-1,0,1
poke a,len-1,0
continue
}
await 0
loop
mes "memcpy = " + ( timeGetTime() - time ) + "ミリ秒"

//strtrimで抜き出す
time = timeGetTime()
repeat 1000000
a = "\\abcdefghijklmnopqrstuvwxyz"
a = strtrim(a,1,'\\')
await 0
loop
mes "strtrim= " + ( timeGetTime() - time ) + "ミリ秒"
自分の環境では、strtrimが少し速かったです。
※一度投稿し直しました。



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