2

私は現在、文字列を格納するために使用される 2 つのデータ構造を作成する必要があるプロジェクトを行っています。そのうちの 1 つはリンクされたリストの形式である必要があり、アルファベットの文字ごとに単語をその内部の個別のリストに分けるように勧められました。効率について考える必要があるため、サイズ 26 のヘッド ポインターの配列があり、指定された単語の最初の文字を整数に変換して、次のように下付き文字に入れることができるようにしたいと考えています。

//a string called s is passed as a parameter to the function
int i = /*some magic happens here*/ s.substr(0, 1);
currentPointer = heads[i]; //then I start iterating through the list

私は周りを検索してきましたが、文字列に含まれる数字を文字ではなく整数に変換する方法だけを見つけたようです。見苦しい if ステートメントのセット

4

4 に答える 4

3

i を最初の文字の値に設定すると、ASCII 値が取得されます。つまり、私はあなたの 0-25 の範囲外です: man ascii を参照してください。最初の aphabet ascii 文字を減算することでそれを減らすことができます。(ケースには気をつけて)

 std::string   s("zoro");
 int   i = s[0];

 std::cout << "Ascii value : " << i << " Reduced : " << i - 'a' << std::endl;

ASCII 値 'z' = 112 と 25 の縮小値が期待どおりに生成されます。

于 2013-02-22T18:06:46.340 に答える
0

atoiこの場合、 orは必要ないようですitoa(たとえば、J)で非常に役立つことは何もしません。次のようなものが必要です。

int i = tolower(s[0])-'a';

理論的には移植性はありません-EBCDICを使用するマシン(つまり、IBMまたは互換性のあるメインフレーム)でコードが使用される可能性がある場合'z'-'a'は、配列のサイズのようなものを使用することをお勧めします。正確に26である必要があります(EBCDICには、いくつかの文字の間に挿入された他の文字が含まれているため、文字は順番に並んでいますが、連続していません)。

おそらくもっと重要なのは、英語以外の言語をサポートしたい場合、物事は急いで完全に変化します。26文字とは異なる文字数がある場合や、すべてが連続しているとは限らない場合などです。このような場合、基本的なデザインは次のようになります。本当に問題です。その1行のコードを修正するのではなく、おそらくほぼ完全に再設計する必要があります。

ただし、余談ですが、ここではリンクリストがあまり適切ではない可能性がかなりあります。

于 2013-02-22T18:00:34.307 に答える