5

私はまだフォーラムに参加したばかりなので、フォーラムのエチケットの問題について事前にお詫び申し上げます。

int配列と配列の違いがよくわかりませんchar

char私は最近、最初は配列を使用して数値の文字列を格納し、後で特定の文字を呼び出しint、それらの操作を使用して積を見つけようとするプロジェクト オイラーの問題用のプログラムを作成しました。char 文字列を使用すると、途方もなく大きな製品が得られましたが、明らかに正しくありません。文字 ( ) としてコンパイルされると思っていたものをstr[n]整数のインライン ( (int)str[n]) に変換しても、まったく同じことが行われました。実際に整数配列を使用した場合にのみ機能しました。

コードは次のとおりです

char文字列用

char str[21] = "73167176531330624919";

これはうまくいきませんでした。4万くらいあるはずの答えに、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 の文字列は自動的に配列として保存されますか、それとも可能ですか?

4

3 に答える 3

4

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

C の文字列は、大部分が文字の配列として格納されます (末尾に null ターミネータが存在することに注意してください)。

文字自体は、英語 (のみ) で使用される文字に 0 ~ 127 のコードを割り当てる ascii と呼ばれるシステムでエンコードされます。したがって、「7」は 7 としてではなく、55 である 7 の ASCII エンコードとして格納されます。

なぜあなたの製品がこれほどまでに大きくなったのか、おわかりいただけたかと思います。

修正するエレガントな方法の1つは、変換することです

int num = (int) str[n];

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

このソリューションでは、文字の ascii コードから 0 の ascii コードを差し引きます (たとえば、「7」)。数値は線形にエンコードされるため、これは機能します (1 桁の数値の場合)。より大きな数の場合は、atoiまたはstrtolを使用する必要があります。stdlib.h

于 2013-08-13T05:01:54.743 に答える
2
char str[21] = "73167176531330624919"

このコードは次と同等です

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

そのため、str[21] に格納されているものは数値ではなく、char (ASCII の同等の表現は異なります) です。

副次的な質問の答え - はい/いいえ、文字列は自動的に char 配列として格納されますが、文字列には最後の要素として余分な文字 ('\0') があります (char 配列にはそのような文字は必要ありません)。

于 2013-08-13T05:33:12.703 に答える