2012-01-05 5 views
-2

誰かが私にこのことを説明できるかどうか疑問に思っていますか?私は、ユーザーに文章を入力するように求めるプログラムを持っています。次に、プログラムはユーザー入力を配列に読み込み、すべての母音を$記号に変更します。私の質問はどのようにforループが機能するのですか? char c = 0を初期化するとき。配列要素がintであることを意味しないのでしょうか?私はそれがどのように機能するのか理解できません。Cで配列をループする

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
char words[50]; 
char c; 

printf("Enter any number of words: \n"); 
fgets(words, 50, stdin); 

    for(c = 0; words[c] != '\n'; c++) 
    { 
      if(words[c] =='a'||words[c]=='e'||words[c]=='i'||words[c]=='o'||words[c]=='u') 
      { 
       words[c] = '$'; 
      } 
    } 
printf("%s", words); 

return 0; 
} 
+0

「c」と「words [c]」は全く異なるものです。そして 'c'を' char'と定義したので、上限が例えば50ではなく500であれば、このコードにはどうなると思いますか? –

答えて

3

コードは、C言語で(整数変数としてc扱わcharは基本的に非常に狭いです整数)。私の見解では、それをint(恐らくunsigned int)と宣言するほうがきれいでしょう。ただし、wordsの長さは最大50文字ですので、char cは問題ありません。ループとして

  1. c = 0がゼロにcを初期化します。
  2. words[c] != '\n'現在の文字(words[c])が改行文字であるかどうかを、開始時と終了時の両方でチェックし、終了する場合は停止します。
  3. c++増分c各反復後。
+0

ループを実行するには、別にint型の変数を宣言する必要がありますか?つまり、char cを残して、int i = 0を宣言します。私のループでcをiに置き換えますか? – adohertyd

+0

@adohertyd:はい、これは私がやることです。私はもはや必要ではないので(ループカウンタとしてのみ使用されているので) 'c'をドロップします。 – NPE

+0

だから、私はちょうどintに変更し、ループは同じ動作します。これはもっと正しいのでしょうか? char []の場合でも常にint変数を使うべきですか? – adohertyd

0

は本当に、charintは、暗黙的に変換されるわけではありません。

この場合、charを小さく表示すると、intと表示されます。 sizeof(char) == 1なので、それはintよりも小さくなっています。これがおそらくその理由です。プログラマチックには、入力文字列が非常に長い場合を除き、この場合は違いはありません。その場合は、intの前にcharがオーバーフローします。

+0

それで、あなたはchar c = 0と言っています。 forループのコンテキストのためにintに変換されますか? – adohertyd

+0

ええと...実際、彼らはそこでしか変換されていません。 'operator []'を使うと変換が起こります。任意の型をイテレータとして使用できますが、それに制限はありません。また、charをintに直接変換することもできます。その逆も可能です。したがって、char c = 0はintをchar **に変換します。 –

0

数値リテラル(あなたの場合は0など)は、タイプcharの変数と互換性があります。実際には、一重引用符で囲まれた文字リテラル(たとえば'\n')もタイプintですが、代入または別のcharと比較すると暗黙的にcharに変換されます。

数値リテラルは、文字リテラルと互換性があり、前者が文字の範囲を超えない限り、リテラルと互換性があります。

以下は、コンパイラの警告をもたらすべきである:これはないであろう一方

char c = 257; 

char c = 127; 
0

charがCであるがshortintlong、及びlong long(および多くの他のタイプ)であるように一体型である:

それはあなたがコンパイルされているマシン上のアドレス可能な最小単位として定義されます通常は8ビットになり、-128〜127の値を保持できることを意味します。また、符号なしの文字は0〜255の値を保持できます。

50の前に常に停止するため、これはイテレータとして機能します。最大127の値を保持できます。int型は通常2,147,483,647までの値を保持できますが、マシンのスペースを8ビットのcharとして4倍にします。 intは、unsigned intの場合、-32,768〜32,767または0 - 6,5535の値を意味するCの少なくとも16ビットであることが保証されています。

あなたのループは配列の要素にアクセスしています。最初の文字を見るには最初はwords[0]、次の文字を見るにはwords[1]を参照してください。あなたはcharを使用しているので、私はあなたのマシンでは8ビットが非常に一般的だと仮定しています。あなたの文字は127以上になるまでループのイテレータを格納するのに十分でしょう。127文字以上の文字を読み込んで(charではなく)奇妙な問題に遭遇するでしょう。 128をホールドし、-128のまわりをループします。セグメンテーションフォルトが発生する可能性が最も高いwords[-128]にアクセスするようにします。

1

アレイは建物のようなものですが、それぞれに番号の付いたフロアがいくつかあります。

フロア1にはジョンが住んでいます。 フロア2ではマイケルが住んでいます。

Jonhアパートに行く場合は、エレベーターで1を押してください。マイケルに行く場合は2を押してください。

それは配列と同じです。配列内のすべての位置に値(この場合は文字)が格納されます。

すべての位置にインデックスが関連付けられています。最初の位置は0です。

配列の位置にアクセスするには、配列[position]を使用します。ここで、positionは、アクセスする配列のインデックスです。

変数cは、処理する位置を保持します。単語[c]を実行すると、配列のc ntの位置にアクセスしてその値を取得しています。

Supose単語は、単語、\nがアレイの最後の位置に設定されているcaracterの終了を決定するためocool

word[1]結果、c

word[0]結果です。