2012-03-06 5 views
2

文字列内の各文字を整数に設定するにはどうすればよいですか?これはハッシュ関数を書くために私がやらなければならない最初のことです。文字列の各文字を整数に設定して、その値を合計できるようにする必要があります。助けてください!それはこれのような何か?C++で文字を整数に変換する

int hashCode(string s) 
{ 
    int Sum = 0; 
    for(int i=0; i<strlen(s); i++) 
    { 
     Sum += (int)s[i]; 
    } 
    return Sum; 
} 
+5

'strlen(std :: string)'?何だって? – trojanfoe

+0

そういうもの、そうです。あなたは正しく長さを取得する方法を見つけるために文字列クラスを参照する必要があります。 –

+0

あなた自身のハッシュ関数を作り始める前に[this](http://en.wikipedia.org/wiki/List_of_hash_functions)を見たことがありますか? – moooeeeep

答えて

11

有り - CおよびC++、charに(典型的には-128から+127までの範囲を有する)だけ小さい整数型です。あなたが数学をすると、通常自動的にintに変換されるので、あなたはキャストも必要ありません。

実際には、forループの停止条件内でstrlen(s)を使用したくない場合があります。少なくともほとんどのコンパイラでは、これは反復ごとにstrlen(s)を再評価しなければならないので、線形アルゴリズムは代わりに二次関数になります。

size_t len = strlen(s); 

for (int i=0; i<len; i++) 
    Sum += s[i]; 

あるいは、パラメータの型が示唆するようsが、実際にstd::stringの場合:

for (int i=0; i<s.size(); i++) 
    Sum += s[i]; 

としてまだもう一つの可能​​性:

Sum = std::accumulate(s.begin(), s.end(), 0); 
+0

+1 'std :: accumulate()' - forループの停止条件の中で 'strlen(s)'を実際に使いたくないのです "IMEコンパイラは、それはほとんどの時間ループの外です。 – bames53

+0

@ bames53:少し更新されたテストをして、gccがループホイストをやっているのがわかりましたが、VC++ではありません。 –

-1

そして、答えは(と思う)整数のASCIIため

int i = atoi("5") 

ところでATOIスタンスです。

Cat Plus Plus atoiは、おそらくサポートされていません。したがって、それを使用しない方がよいでしょう;)

+0

'atoi'を使用しないでください。壊れており、エラーを適切に伝えることができません。 –

+0

@EdS .: 'atoi'は*どんな方法でも*信頼できない*信頼できません。 –

3

文字は通常、内部で整数で表されます。したがって、s[i]は整数に割り当てることができます。

の文字があり、int 1を保存したい場合は、s[i]-'0'を使用できます。

0

strtolを使用できます。これは、タグ付きのC++であるため、文字列ストリームです。

string myStream = "45"; 
istringstream buffer(myString); 
int value; 
buffer >> value; 
+0

いいえ、 'atol'は使用しないでください。 'strtol'、あなたが本当に必要ならば、しかし、ハッシュの目的のためには、まったく変換しないかもしれません。 –

+0

@CatPlusPlus:そうだね。私はあなたが本質的に失敗をチェックすることができないことを忘れていました。それは0を返します... –

+0

Cat Plus Plus。しかし、私たちの演習では、それらをasciiに変換してasciiを合計し、次にモジュロを分けます。そのタイプのハッシュ関数の名前はありますか? –

0

あなたは

を探しているかもしれません
Sum += s[i] - '0'; 

数値を文字列に変換する一般的なケースについては、this FAQ entryを参照してください。

0

あなたが探している機能はsscanfです。

あなたは、ヘッダーstdio.hでそれを見つけると、それはあなたがこのようにそれを使用することになり、あなたの場合には、この

int sscanf (const char * str, const char * format, ...); 

のように定義されています:あなたの文字列がのみで構成されていないない場合

string str = "SomeStringWithNumbers"; 
int s, len; 
len = str.length(); 
for(int i = 0; i < len; i++) 
{ 
    int status = sscanf(str[i], "%d", &s); 
    // Check status if necessary 
} 

あなたの希望するインテグージャーはあなたがパラメータを適応させる必要があります。最初のパラメータを変更して、番号が存在する部分の文字列を直接指すようにするか、フォーマット文字列を変更する必要があります。また、戻り値をチェックする必要があります。

関連する問題