2013-08-13 11 views
5

私はフォーラムにまだ参加していませんので、事前にフォーラムの礼儀の問題についてお詫び申し上げます。int/char配列/文字列の相違点

intアレイとcharアレイの違いを理解するのに問題があります。

私は最近、最初にcharアレイを使用して数字の文字列を格納し、その後特定の文字を呼び出して、製品を見つけるためにint操作を使用しようとしたProject Euler問題のプログラムを作成しました。私がチャー文字列を使用したとき、私は、まったく大きな製品を得ました、明らかに間違っていました。私が文字(str[n])としてコンパイルされると思ったものを整数インライン((int)str[n])に変換したとしても、まったく同じことをしました。私が実際に整数配列を使用したときだけ、それは機能しました。これは動作しませんでしたchar文字列

char str[21] = "73167176531330624919"; 

ため

を次のように

コードです。私は約40kだったはずの答えに対して約1.5兆の答えを得ました。

int配列

int str[] = {7,3,1,6,7,1,7,6,5,3,1,3,3,0,6,2,4,9,1,9}; 

のためにこの仕事をやったことです。私はインラインタイプのキャスティングもやっていました。

これらのことがうまくいかなかった理由についての説明と、これらのアイデアをよりよく理解できるような何かが理解できます。役に立つものへのリンクも同様です。私は文字列と配列とポインターを自分で調べています(私は高校時代に自分自身を教えています)が、コンセプトはまだ混乱しています。

Cの文字列が自動的に配列として格納されるのですか、そうすることは可能でしょうか?

+3

おそらく[この表](http://www.asciitable.com)は、ASCII文字をint型の値として扱っているかどうかを明らかにするかもしれません。そして、「配列」によって、基礎となる文字データを含む連続したメモリを意味する場合、暗黙の0ターミネータが付けられた状態で格納されます。 – WhozCraig

+0

そのテーブルはchar '0'がint値48に対応すると言っていますか? – Charles

+0

はい、値は符号なしですが、これは重要ではないように見えるかもしれませんが、拡張ASCII文字を処理する必要がある場合はその値になります(その下の表を参照)。あなたは正しい道を歩いています。以下のいくつかの答えがこれをよりよく説明している。また、これは( '0' == 48)ASCIIの場合にのみ真であることに注意してください。他のシステム依存の文字セット([EBCDIC](http://en.wikipedia.org/wiki/EBCDIC)など)もあります。 – WhozCraig

答えて

4

WhozCraigの答えを詳しく説明すると、あなたの問題は文字列ではなく個々の文字と関係します。

Cの文字列は、文字の配列として格納されます(最後にヌルターミネータが存在することに注意してください)。

文字自体はasciiと呼ばれるシステムでエンコードされており、英語で使用されている文字(0〜127)にコードを割り当てます。したがって、「7」は7として保存されず、7のASCIIエンコーディングとして55となります。

あなたの製品がなぜそんなに大きくなったのか分かります。修正する

一つエレガントな方法は、このソリューションは、あなたの文字のASCIIコードから0のASCIIコードを減算

int num = str[n] - '0'; 
//thanks for fixing, ' ' is used for characters, " " is used for strings 

int num = (int) str[n]; 

を変換することであろう、 "7" と言います。数字は線形に符号化されるので、これは機能します(1桁の数字の場合)。大きい数字の場合は、atoiまたはstrtolからstdlib.h

+0

私はコードを私の桁に変換したいと思っています。あなたが言うように、エレガントです:) – Charles

+0

@ user2673602ありがとう、嬉しい、助けて! –

+1

私は変換のために['strtol()'](http://en.cppreference.com/w/c/string/byte/strtol)を提案しますが、その考え方はあります。 – WhozCraig

3

文字列はヌル終端バイトの文字配列です。 cには別の文字列データ型はありません。

charを整数として使用する場合は、数値のASCII値が使用されます。たとえば、printf("%d\n", (int)'a');のようなものを入力すると、97( 'a'のascii値)が出力されます。

整数の配列に変換する場合を除き、数字の計算に数値の文字列を使用することはできません。その整数形式に文字として数字を変換するには、あなたがこのような何か行うことができます。

char a = '2'; 
int a_num = a - '0'; 
//a_num now stores integer 2 

をこれが「0」(48)のASCII値がASCII値から減算されるようにする「2」(50)最後に、2

2
char str[21] = "73167176531330624919" 

このコードを残すことSTR [21]に格納されているので、どのような

char str[21] = {'7','3','1','6','7','1','7','6','5',/ 
       '3','1','3','3','0','6','2','4','9','1','9'} 

に相当する数字ではなく、CHAR(そのASCII等価表現は異なっています)。文字列は自動的にchar配列として格納されますが、文字列は最後の要素として余分な文字( '\ 0')を持っています(char配列にはこのようなものは必要ありません)。 )。