Tab文字考慮strlen †
Tab文字を指定した数の幅で展開した文字数をカウントします。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
-
|
|
-
|
|
|
-
|
|
!
|
-
|
!
| #module
#defcfunc tstrlen str tbuf, int tsize
buf = tbuf+"\\0" : i = 0 : t=1
repeat
if peek(buf,cnt) == '\\0' : break
if peek(buf,cnt) == '\t'{
tcnt = cnt
repeat
if (tsize -(i \ tsize)) != tsize{
i = i+(tsize -(i \ tsize))
break
}else{
i + tsize
break
}
loop
}else{
i++
}
loop
return i
#global
|
1
2
|
| a ="AB\tCDEF\t"
mes tstrlen(a,4)
|
- 安定してるかどうか微妙ですけど、一応載せてみました。 -- 猫太?
- "\\0"を連結しているのは無駄ですので、こうとかどうですか?でもこういうのがゴロゴロしているといろいろ使えますよね^^(よく読むと未使用変数とかが...) -- kz3
+
| | ... |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
-
|
|
!
-
|
!
| #module
#defcfunc tstrlen str s1, int p2, local len
buf = s1
repeat
if peek( buf, cnt ) = 0: break
if peek( buf, cnt ) = '\t'{
len += p2-len\p2
}
else{
len ++
}
loop
return len
#global
mes tstrlen( "abc\t", 4 )
mes tstrlen( "abcd\t", 4 )
|
|
- 2バイト文字の2バイト目が'\t'に等しい文字があると誤カウントしてしまうのではないでしょうか(そういう2バイト文字があるかどうか不明ですが…)。
String/改行を参考に手を加えてみました↓。 -- eller
- おぉ!早速指摘、修正どうもです 自作エディタのTab文字で使ってるので、皆さんの修正で安心しました。 -- 猫太?
- \tは0x09なのでSJISなら考慮の必要はないですね。 -- kz3
- あら、チェックしてみましたけどkz3さんとellerさんのやつでAB\tCDEF\tを数えると9って返ってきますね。これは正常なのですか? -- 猫太?
- 猫太さん指摘ありがとうございます^^; -- kz3
- 猫太さんkz3さん、ありがとうございます。調べもしないでごめんなさい。m(_ _)m自分のは不要となるので削除しました。 -- eller