2017-05-11 4 views
0

配列は1ではなくゼロで始まるので、私はこれを補うためにカウンタ(i)に1を加えていることをコードで明確にしたいと思います。しかし、私の機能は私の現在のものを読んでいない。配列を扱う際に+1をどこに追加しますか?

私はコーディングでは新しいので謝罪しますが、私は質問に答えます。

do 
{ 
    printf("\nMax # of characters?\n"); 
    fflush(stdin); 
    scanf("%d", &x); 
} while (x < 1 || x > 200);  

do 
{ 

    printf("\nEnter Text:\n"); 

    enter[i] = getchar(); 
    i = 1; 
    error = 0; 

    do 
    { 
     printf("i = %d\n", (i - 1)); 
     c = getchar(); 
     enter[i] = c; 
     i++; 
    } while (c != '\n'); 

    if (i > (x + 1)) //<----------- Even though I added one because arrays start at [0] 
    {     //    the program still tells me 'i' (counter) is one 
         //    more than it should be 

     printf("Words must not be longer than %d letters\n", x); 

     printf("You entered %d letters\n", (i - 1)); // -1 to count for the '\n' 
     error = 1; 
    } 

} while (error != 0); 


printf("\nOutput: %s\n", enter); 

return 0; 
+4

Cは0ベースの配列を使用しているため、コードには常にその値が反映されている必要があります。あなたが「1を追加する」ために必要な唯一の場所は、UIの中にあります。したがって、printfはI + 1&x + 1です。 – Neil

+0

有効な 'ì'の条件は' i

+2

'fflush(stdin)'は、標準では明示的に未定義の動作です(実装によってはサポートされていますが、移植性がありません)。入力ストリームを消去しようとしている場合は、他の方法もあります。 –

答えて

3

まず、iの初期化を忘れてしまいます。最初の

enter[i] = getchar(); 

は未定義の動作です。

第2に、iはアレイへのインデックスです。 xが入力可能な文字数の場合、iは、正当な文字を含めて0x - 1の間になるはずです。また\nためiをインクリメントするので、法的にiは、だからあなたのエラーメッセージが印刷されなければならない

0 <= i <= x 

によって制約される場合i > xない


i > x + 1かの脚注:あなたは、ゼロから、なぜ我々のインデックスを疑問に思う場合あなたが私たちが1つからインデックスを付けるべきだと言う人は間違っています。そして、私はEdsgar Dijkstraの確定用紙Why Numbering Should start at Zeroであなたを指摘することができます。

+1

(なぜ番号付けはゼロから始めるべきですか)...そして、ゼロベースのインデックスがコンピュータによって話される*バイナリ*と、それぞれ異なるデータ型、ポインタ算術、配列の定義内のバイト数に対する反復、例えば'a =&a [0] =&(*(a + 0))=(a + 0)= a'などとなります。 '0'の代わりに' '1'':)' –