タグ付けされた質問 「strings」

「文字列」は、通常人間が読めるテキストの単位を表す一連の文字です。このトピックに関する質問は、プログラムでの文字列の処理、およびさまざまな言語と環境が文字列を定義および操作する方法を扱います。

1
PHPは内部的にどのように文字列を表しますか?
UTF8? UTF16? PHPの文字列も使用されているエンコーディングを追跡しますか? たとえば、このスクリプトを見てみましょう。私が実行すると言う: $original = "शक्नोम्यत्तुम्"; 実際に何が起こりますか? 明らかに、$original7文字しか含まれないと思います。それらのグリフはそれぞれ、数バイトで表される必要があります。 それから私は: $converted = mb_convert_encoding ($original , "UTF-8"); どうなり$convertedますか?とどう$converted違うの$original? それはまったく同じバイトシーケンス$originalですが、異なるエンコーディングを使用していますか?
18 php  strings 

3
Javaで文字列を連結すると、メモリにいくつの文字列が作成されますか?
Javaの不変文字列について尋ねられました。文字列に多数の "a"を連結する関数を書くことを任されました。 私が書いたもの: public String foo(int n) { String s = ""; for (int i = 0; i < n; i++) { s = s + "a" } return s; } その後、ガベージコレクションが発生しないと仮定して、このプログラムが生成する文字列の数を尋ねられました。n = 3に対する私の考えは 「」 「a」 「a」 「aa」 「a」 「aaa」 「a」 基本的に、ループの各反復で2つの文字列が作成されます。ただし、答えはn 2でした。この関数によってメモリ内に作成される文字列は何ですか?その理由は何ですか?
17 java  strings  object 

3
インターフェイスでstring_viewを使用する必要があるのはいつですか?
私は模倣Aに設計された内部ライブラリを使用しているC ++ライブラリを提案し、いつか過去数年間で、私はそのインターフェースが使用してから変更を参照std::stringしますstring_view。 そこで、新しいインターフェースに適合するようにコードを忠実に変更しました。残念ながら、私が渡さなければならないのは、std :: stringパラメーターと、std :: string戻り値です。そのため、私のコードは次のように変更されました。 void one_time_setup(const std::string & p1, int p2) { api_class api; api.setup (p1, special_number_to_string(p2)); } に void one_time_setup(const std::string & p1, int p2) { api_class api; const std::string p2_storage(special_number_to_string(p2)); api.setup (string_view(&p1[0], p1.size()), string_view(&p2_storage[0], p2_storage.size())); } 私は、この変更がAPIクライアントとして私に何を買ったのか、実際には、コードを増やすこと以外は見当たらないでしょう(おそらく失敗するためです)。API呼び出しの安全性は低下し(APIがパラメーターのストレージを所有しなくなったため)、おそらくプログラム0の作業を節約しました(コンパイラーができる最適化の移動により)。起動後またはどこかで大きなループで行われない、または行われない割り当てがいくつかあります。このAPI用ではありません。 ただし、このアプローチは、他の場所で見られるアドバイス、たとえば次の回答に従うようです。 余談ですが、C ++ 17以降では、std :: string_viewを優先してconst std :: …

3
すべてのローカライズと文字列タイプで機能する一般化された文字列逆関数を書くことは可能ですか?
Dev-DaysのJon Skeet(Tony the Ponyと一緒に)のプレゼンテーションを見ていました。 「文字列の逆関数を書く」はインタビュー101をコーディングしていますが、すべてのローカリゼーションとすべての文字列タイプで機能するものではなく、一般的な文字列の逆関数を書くことが実際に可能かどうかはわかりません。 入力文字列がASCII、UTF8、UTF16(固定長および可変長)などであるかどうかを検出することとは別に、 Jonが強調表示した「次の文字にアクセントを適用する」(U + 0301)コードがあります。次に、表示される場合とされない場合、または二重文字としてエンコードされる場合があります。 「文字列を逆にする」ことは、実際には難しいコンピューターサイエンスのタスクの1つであるようです。

7
Cライブラリの関数は常に文字列の長さを期待すべきですか?
私は現在、Cで書かれたライブラリに取り組んでいます。このライブラリの多くの関数は、引数として、char*またはconst char*引数に文字列が必要です。私は、文字列の長さを常に期待しているsize_tので、ヌル終端が必要ないようにそれらの関数から始めました。ただし、テストを作成する場合strlen()、次のようにが頻繁に使用されます。 const char* string = "Ugh, strlen is tedious"; libFunction(string, strlen(string)); 適切に終了した文字列を渡すようにユーザーを信頼すると、安全性は低下しますが、より簡潔で(私の意見では)読み取り可能なコードになります。 libFunction("I hope there's a null-terminator there!"); だから、ここで賢明な慣行は何ですか?APIの使用をより複雑にしますが、ユーザーに入力を考えさせるか、ヌル終了文字列の要件を文書化し、呼び出し元を信頼しますか?
15 c  api  strings 

16
何のために文字列の反転を使用しますか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または詳細な議論を求める可能性があります。この質問を改善し、おそらく再開できると思われる場合は、ヘルプセンターをご覧ください。 6年前に閉鎖されました。 PHP strrev()では、Rails .reverseではですが、ほとんどの言語には文字列の逆関数はありません。いくつかは、文字に使用できる配列反転関数を持っています。私はこれは大きな見落としだと思っていましたが、それは私に起こりました、あなたは実際に文字列リバースを何のために使用しますか? 私がそれを見たと思うことができるのは、デモとレッスンで「Hello World!」をオンにすることだけです。「!dlroW olleH」に。 私の質問は 文字列を反転する用途はありますか、それとも完全に無意味ですか? 。 補遺 私が予想していたより多くの答えがありましたが、それらすべてが完全にアカデミックなわけではありませんでした。私は誰も正当な例を思い付かせることができないお金を入れていただろう。また、新しいことを学ぶとは思いませんでしたが、Mark Canlasの正規表現の提案は素晴らしく、それを証明する機会を楽しみにしています。ありがとうございます。

1
ASCIIテーブルの句読点が至る所にあるのはなぜですか?
ではASCIIテーブル、句読点は(非印字文字の間や数字の前に表示される!"#$%&')*+,-./数字と大文字(間、) :;<=>?@)、大文字(間[\]^_`)と小文字の文字、小文字(後{|}~)。 一見すると、これらが一緒にグループ化されることが期待されます。すべての英数字の前または後ろにある可能性があります。しかし、これは事実ではありません。それらはこれらの異なるグループに広がっています。 これはなぜですか?キャラクターがこのようにグループ化される理由はいくつかあります(歴史的な可能性がある)。
13 strings  ascii 

2
StringBuilderまたはStringBufferはいつ使用する必要がありますか?
実稼働Webアプリケーションでは、私の仲間のプログラマーがStringBufferをどこでも使用していました。現在、アプリケーションの開発と修正を担当しています。StringBuilderとStringBufferを読んだ後、すべてのStringBufferコードをStringBuilderに置き換えることにしました。これは、データBeanでスレッドセーフが必要ないためです。 例:(各データBeanでStringBufferの使用を確認できます) @Override public String toString() { StringBuffer sb = new StringBuffer();// replace it from StringBuilder sb.append(" ABCD : ").append(abcd); sb.append(", EFGH : ").append(efgh); sb.append(", IJKL : ").append(ijkl); } セッション/リクエストごとに個別のデータBeanを作成します。セッションは、他のユーザーがアクセスできない単一のユーザーによって使用されます。 移行する前に他の点を考慮する必要がありますか? 単一のスレッドがある場合(待機中のスレッドがないか、新しいスレッドがオブジェクトロックを探していない場合)、StringBufferまたはStringBuilderのどちらでも同様に実行されます。StringBufferの場合、オブジェクトロックを取得するのに時間がかかることは知っていますが、オブジェクトロックの保持/解放を除いて、それらの間にパフォーマンスの違いがあるかどうかを知りたいです。

3
std :: stringのc_str()にはどのようなパフォーマンスが期待できますか?常に一定の時間ですか?
私は最近、いくつかの必要な最適化を行ってきました。私がやっていることの1つは、ostringstreams-> sprintfsを変更することです。私はたくさんのstd :: stringsをacスタイルの配列、alaにスプリントしています char foo[500]; sprintf(foo, "%s+%s", str1.c_str(), str2.c_str()); Microsoftのstd :: string :: c_str()実装は一定の時間で実行されることがわかりました(内部ポインターを返すだけです)。と思われるのlibstdc ++が同じことを行います。stdはc_strを保証しませんが、これを行う別の方法を想像するのは難しいと思います。たとえば、メモリにコピーした場合、バッファにメモリを割り当てる必要があります(呼び出し元に任せて破棄します-STLコントラクトの一部ではありません)または、内部staticにコピーする必要がありますバッファ(おそらくスレッドセーフではないため、その寿命については保証されません)。したがって、内部的に維持されているヌル終了文字列へのポインタを単に返すことが唯一の現実的な解決策のようです。

8
C文字列は常にヌルで終了しますか、それともプラットフォームに依存しますか?
現在、私は組み込みシステムで作業しており、オペレーティングシステムなしでマイクロプロセッサに文字列を実装する方法を考えています。これまでのところ、私がやっていることは、NULLで終了する文字ポインタを持つという考えを使用し、NULLが終了を示す文字列として扱うことです。私はこれがかなり一般的であることを知っていますが、これが当てはまることを常に期待できますか? 私が尋ねる理由は、ある時点でリアルタイムオペレーティングシステムを使用することを考えていたため、現在のコードを可能な限り再利用したいからです。そこにあるさまざまな選択肢について、文字列が同じように機能することをほとんど期待できますか? 私の場合はもっと具体的にしましょう。私は、シリアルポート経由でコマンドを受け取って処理するシステムを実装しています。コマンド処理コードを同じにして、RTOS(コマンドを含む)で作成された文字列オブジェクトがすべてNULLで終了することを期待できますか?または、OSに基づいて異なりますか? 更新 この質問を見るようにアドバイスされた後、私はそれが私が尋ねていることを正確に答えていないことを決定しました。質問自体は、文字列の長さを常に渡す必要があるかどうかを尋ねています。これは私が尋ねているものとはまったく異なり、答えの一部には有用な情報が含まれていましたが、私が探しているものではありません。なぜか理由を与えるためにそこに見えた答えではないヌル文字で文字列を終了させます。私が尋ねているものとの違いは、異なるプラットフォームの生まれた文字列がnullで独自の文字列を終了することを多かれ少なかれ期待できるかどうか、それが理にかなっている場合は、すべてのプラットフォームを試してみる必要はありません。

4
無意味なデフォルト値を持つ構造体
私のシステムでは、私は頻繁に空港コード(で動作し"YYZ"、"LAX"、"SFO"、など)、彼らはまったく同じ形式(大文字として表現3文字)に常にあります。システムは通常、APIリクエストごとにこれらの(異なる)コードの25〜50を処理し、合計で1,000を超える割り当てが行われ、アプリケーションの多くのレイヤーを通過して、頻繁に同等性が比較されます。 最初は文字列を渡すだけで、少しはうまくいきましたが、3桁のコードが予期される場所に間違ったコードを渡すことで、多くのプログラミングの間違いにすぐに気付きました。また、大文字と小文字を区別しない比較を行うことになっていた問題に遭遇しましたが、代わりにそうしなかったため、バグが発生しました。 このことから、文字列の受け渡しを停止してAirport、空港コードを取得して検証する単一のコンストラクターを持つクラスを作成することにしました。 public sealed class Airport { public Airport(string code) { if (code == null) { throw new ArgumentNullException(nameof(code)); } if (code.Length != 3 || !char.IsLetter(code[0]) || !char.IsLetter(code[1]) || !char.IsLetter(code[2])) { throw new ArgumentException( "Must be a 3 letter airport code.", nameof(code)); } Code = code.ToUpperInvariant(); } public string …


5
ASCII文字列をどのように少ないバイト数に圧縮しますか?
私は、他のデバイスにメッセージを送信する独自​​のプロトコルを備えた組み込みデバイスで作業しており、送信されたパケットを解析するアプリケーションを作成しています。各パケットは8バイトを運びます。プロトコルは、最初のバイトがヘッダーで、残りの7バイトがデータであると定義されています。 特定のID文字列を渡そうとしていますが、ID文字列は8文字(ASCII)であるため、7バイトに収まりません。 私の同僚が私に言ったのは、元の文字列の8バイトのASCII文字列を整数(10進数)に変換し、その4バイトを送信するということです。彼らは、4バイトから元の文字列を取得できるはずだと言った。これに頭を包むのに苦労しています。 「IO123456」のようなID文字列がある場合、それは0x49 0x4f 0x31 0x32 0x33 0x34 0x35 0x36のASCIIです。それを整数に変換して4バイトで圧縮すると、元の文字列を取得できます?何かが足りないのですか、同僚が間違っていますか?これは本当に奇妙な質問であると理解していますが、これは私にはまったく意味がありません。
12 strings  ascii  byte 

1
最短共通スーパーストリング:指定されたすべてのストリングフラグメントを含む最短ストリングを検索
いくつかの文字列フラグメントを考えて、すべてのフラグメントを含む最短の単一文字列(「出力文字列」)を見つけたいと思います。フラグメントは、出力文字列で互いにオーバーラップできます。 例: 文字列フラグメントの場合: BCDA AGF ABC 次の出力文字列にはすべてのフラグメントが含まれており、単純な追加によって作成されています。 BCDAAGFABC ただし、この出力文字列はオーバーラップを使用するため、より優れています(短い)。 ABCDAGF ^ ABC ^ BCDA ^ AGF この問題のアルゴリズムを探しています。厳密に最短の出力文字列を見つけることは絶対に重要ではありませんが、短いほど良いです。入力フラグメントのすべての順列を追加し、オーバーラップ(NP完全と思われる)を削除しようとする明白な単純なアルゴリズムよりも優れたアルゴリズムを探しています。 私は解決策に取り組み始めましたが、それは非常に興味深いことを証明しています。他の人が何を思い付くのか見てみたいです。しばらくして、進行中の作業をこの質問に追加します。

6
文字列を1つずつ連結するのは非効率ですか?
Cでのプログラミングの日々を思い出します。2つの文字列が結合されると、OSは結合された文字列にメモリを割り当てる必要があります。解放されます。したがって、リストに参加する場合のようにこれが複数回行われると、OSは次の連結後に解放されるために、より多くのメモリを常に割り当てる必要があります。Cでこれを行うより良い方法は、結合された文字列の合計サイズを決定し、結合された文字列のリスト全体に必要なメモリを割り当てることです。 現在、最新のプログラミング言語(C#など)では、コレクションを反復処理し、すべての文字列を一度に1つの文字列参照に追加することで、コレクションの内容が結合されるのがよく見られます。これは、最新のコンピューティング能力を備えていても非効率ではありませんか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.