• ベストアンサー

文字列の最後の一字を削除

string str; str=”abc壁xデスクトップyyy”;//一例 strから最後の一字を取り除くときに 最初から順番に各文字が2バイト文字か1バイト文字かを調べていき最後のバイトが2バイト文字の第2バイトと判明したときに最後の2バイトを除去し最後のバイトが1バイト文字と判明したときにstrの最後の1バイトを除去する ことによってできますがstrが膨大だと時間がかかります 文字列作成時に各文字が2バイト文字なのか1バイト文字なのかをメモっておくのも管理が大変ですし もっと早く最後の文字が1バイト文字なのか2バイト文字なのかを判定する方法は有りませんか?

  • nubou
  • お礼率62% (293/470)

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

  • ベストアンサー
noname#5537
noname#5537
回答No.1

いわゆるシフトJISコードを使っている場合はその方法しかありません。 VC のランタイムライブラリには _ismbslead, _ismbstrail という関数がありますが、中でやっていることは同じです。 初めから文字列を Unicode で扱っておけば管理は楽になります。 基本的にすべての文字が2バイトなので。 ただ、今更変更できないかもしれませし、Win95 系は多くの API が Unicode に対応していないので、そういう API を使う場合文字コードの変換が必要になるという問題もあります。 # 環境が書かれていないので勝手に Windows と決め付けてしまいました。

nubou
質問者

補足

ありがとうございます プログラムはWinアプリ コンパイラは無償Borland C++5.5(API) MFCではありません だからシフトジスでやるしか有りません 制御コードは第2バイトでもだぶらないので改行コード以上はさかのぼらなくてもいいのですがそういったコードが全くない場合には最悪一番最初までさかのぼらなければないませんね 100kBだとたった一つの文字を取り除くだけで最悪100kB分検査しなくてはならないのですね やっぱり文字コードと一緒にバイト数情報を記録しないといけないのでしょうか?

その他の回答 (2)

回答No.3

> strから最後の一字を取り除くときに ... > ことによってできますがstrが膨大だと時間がかかります メモリ内の文字列ですよね? そんなに時間がかかるとは思えないのですが...実測したのでしょうか?

nubou
質問者

お礼

ありがとうございました 前に別件でstringの操作でものすごい時間がかかり char*に変えたらあっという間に処理が終わったので 本件で時間がかかるようならchar*にすれば問題ないですね

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

後ろから見ていって「シフトJISでない(シフトJISの1文字目でも2文字目でもない)」バイトを探して、 そこから始めるようにすればいくらか速くなるでしょう。 (シフトJISに含まれない文字にはコントロールコード、特殊記号、数字などがあります。) シフトJIS判断関数は、昔のBCCにはあったのですが、 今の処理系ではどうなっているかわかりません。 無いようならマクロかなんかで作ってください。

nubou
質問者

お礼

ありがとうございます 半角'a'が続いていると後ろから検査すれば一番最初のバイトにいくまで最後の文字が1バイト文字'a'だと判断されないけれども確率的にはだいぶ早く重ならないコードにぶち当たり早く検出できるということですね

関連するQ&A

  • 文字列の最後がNULL ?

    例えば char str[] = "mojiretu" と言うのがあって、文字列の終端を判定するのに (str+8)がNULLではなく*(str+8)がNULLであることを判定します。 これってなぜですか?よろしくお願いします。

  • 文字列の操作について教えて下さい。

    Javaで文字列の操作をしたいと考えています。 String str1 = "あいうえおかきく"; String str2 = "あいうえお"; 上記のようなstr1、str2という文字列があるとします。 str1は、str2と同様の文字列を先頭から含んでいます。 str2と同じ文字を省き、それ以降の文字列を取り出して、 String str3 = "かきく"; という文字列を取り出す処理を行いたい、と考えています。 一般的には、どのようなロジックを組むのかと思い質問させて頂きました。 みなさんなら、どのようなプログラムか教えてください。 よろしくお願い致します。m(_ _)m

  • 文字列で渡された式

    質問です。 タイトルのままですが文字列で渡された式で 処理を決定させることはできるのでしょうか? たとえば ============================ dim str as string = "10 > 5" if strの文字列判定 then msgbox("TRUE") else msgbox("FALSE") end if ============================

  • javascriptで文字列の差分を取得

    var str1 = "abc"; var str2 = "abdec"; var str3 = "abcdef"; var str4 = "defgabc"; 元々の文字列文字数固定ではない(例として)「abc」がありまして、 その最初か最後か途中の文字列の間に何かしらの文字列が入る可能性があります。 そのように追加された文字列を割り出したいのですが、 どのようにしたら良いでしょうか?アイディアお持ちでしたらよろしくお願いします。

  • $XXX を含んだ文字列の評価

    '$XXX + $yyy' という文字列($XXXと$yyyは単なる文字列)を評価したものを別の変数に格納したいのですがどうすればいいでしょう。 <?php $XXX = 10 ; $yyy = 5 ; $str = '$XXX + $yyy' ; $ans = なんとか文字列を評価; echo $ans ; ?> 表示 -- 15

    • ベストアンサー
    • PHP
  • 小文字、大文字変換

    こんにちは。 javaの勉強をやっているのでですが 思うとおりに進みません。 一文字ずつ小文字なら大文字に大文字なら小文字に変換するといったものです。 途中経過です。 import java.io.*; class Ex60{ public static void main(String args[])throws IOException{ String str3 ="0"; String output = "0"; String s1 = new String("end"); while(str3.equals(s1) == false ){ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(str3.equals(s1) == false ){ System.out.print(">"); str3 = br.readLine(); if(str3.equals(s1) == true) break; for(int i=0; i<str3.length(); i++){ char c = str3.charAt(i); if(Character.isLowerCase(c)) output = str3.toUpperCase(); else if(Character.isUpperCase(c)) output= str3.toLowerCase(); } System.out.println("入力された文字列は" + str3 + "です。"); System.out.println("大文字小文字を変換すると" + output + "です。"); } } } } /* 実行結果 >abc 入力された文字列はabcです。 大文字小文字を変換するとABCです。 >AbC 入力された文字列はAbCです。 大文字小文字を変換するとabcです。 >AAb 入力された文字列はAAbです。 大文字小文字を変換するとAABです。 */ 条件として一文字が大文字か小文字の判定にはCharacterクラスの isLowerCase()メソッド、isUpperCase()メソッド 一文字の変換はtoUpperCase()メソッド、toLowerCaseメソッドを使います。 どなたかよろしくおねがいします。

  • シフトJIS文字列の中から

    (string str;) pos=str.find_last_of("「"); で2バイトさがそうとしても文字化けと同じように間違った文字を見つけてしまいます このシフト文字列対策はどうすればいいのでしょうか?

  • Cでは文字列をどのように認識するのでしょうか?

    C言語には文字列型というものは存在しないと教わりました。 文字列の終わりはヌル文字で認識できますが、 文字列型というものが存在しないのに何故次のバイトを読もうとするのですか? たとえばchar str[] = "abc";、あるいはchar *p = "abc";とあったとして printf(str);あるいはprintf(p); でなぜabcが出力されるのでしょうか?なぜaの次にbがbの次にcがあるとわかるのでしょうか? char型で先頭アドレスが渡された場合、ヌル文字を見つけるまでアドレスをインクリメントし続けるという決まりでもあるのでしょうか? それに文字列型というものが存在しないなら''と""を分ける意味もないのでは??

  • 文字列に\nを入れたい

    データベースAccessからデータを取得しTextFieldにその取得したデータを表示させたのですが、文字数が長くてTextFieldに収まらなくなっしてしまいました。そこで取得した文字列に新たに\nを入れて改行させようとしています。 String str = "文字列40字以上…" if(str.length >= 40){ ***処理内容*** 文字列が40字以上なら40文字目のすぐ後ろに\nを足して改行させて表示させたい。 ただし、40文字目を区切りとして改行させ表示させる。例)96文字なら3行に表示させるようにする。 } このような処理を行いたいのですが、良い方法がわかりません。アドバイスをお願いします。

  • VBAの文字列の中に”(全角のダブルコーテーション)を使う

    VBAのStringの中に”(全角のダブルコーテーション)を使おうとしているのですが、VisualBasicEditorにより自動的に ""(半角のダブルコーテーション2つ)に変換されてしまいます。 Dim str as String str = "abc”def"    ↓ str = "abc""def" 文字列中に全角のダブルコーテーションを使う方法を教えてください。よろしくお願いします。

専門家に質問してみよう