2016-12-02 11 views
-5

下記のプログラムがあります。私はchar配列をどのように逆にするのか理解していません。私はそれがうまく動作することを意味、それはユーザーによってchar配列に格納されている文字列を反転しますが、私はそれがどのように動作し、どのように順序を逆にするのか知りたいですか?基本的に私は最初のforループを理解していません。それは本体に何らかのステートメントがなく、forループの最初の部分が欠けています。典型的で難しい言葉ではなく、簡単で簡単な言葉で説明してください。私は英語のネイティブスピーカーではありません。どうもありがとう。誰かこのプログラムを私に説明してもらえますか?

#include <iostream> 
using namespace std; 

int main() 
{ 
    char name[99]; 
    int counter=0; 

    cin >> name; 

    for(;name[counter]!='\0'; counter++) 
    {} 

    cout << "\nName: "; 

    for (;counter > 0; counter--) 
    { 
     cout << name[counter-1]; 
    } 
} 
+1

まずループ:[Cスタイルの文字列がnull終端されている](https://en.wikipedia.org/wiki/Null-terminated_string)、そのカウンタの値は、ループの後に何になりますか? – user4581301

+0

counterの値は 'char'配列の要素の値と同じになります –

+2

これは本当に斬新な考えです。デバッガを起動し、コードを実行して、それが何をするか正確に従ってください。コードの読み方やその意味を学ぶだけでなく、デバッガや問題解決の非常に有用なスキルや、チュートリアルを提供する人がいないときの対処法を練習します。 –

答えて

0

C文字列はnull( '\ 0')で終了します。最初のループはに含まれる文字列の末尾が見つかるまでcounterをインクリメントします。これはヌル文字で示されます。重要な部分は、counterが最初のforループの外側で宣言され、スコープ内にあり、2番目のループが実行されるときに同じ値で残ることです。 2番目のループは文字列の最後でnameに開始し、最初の文字が印刷されるまで文字を印刷します。

+0

説明してくれてありがとうございますが、まだ質問があります: 1.最初のforループに 'counter 'の代わりに' name [counter] 'という配列が含まれているのはなぜですか? 2.配列の最初の要素が0番目のインデックスにあるため、2番目のループに '='と '> 'の比較部分が含まれていないのはなぜですか? = 'サイン? –

+1

@KhubaibKhawar Answers。 1.コードは、 'name'にヌル終端文字( '\ 0')を探しています。したがって、 'name [counter]'をチェックしなければなりません。 2. 'name'への索引付けが' counter-1'であるため、 '>'が使用されます。 'counter 'が0のときに実行されたループが' name [-1] 'が出力され、それが配列の境界を超えている場合。 –

+0

@KhubaibKhawar 'name'の長さを知らないので、文字列の終わりを示す' \ 0'を見つけるまで反復します。当然のことながら、この同じコードは、長さを事前に知ることができる無限の異なる方法で書かれていた可能性があります。 – Havenard

-1

あなたはそれがあなたのカウンターは、あなたのように入力した内容の文字の数にインクリメントしているこの時点.AT「\ 0」に達するまで、上記カウンタをインクリメントforループ0

for(;name[counter]!='\0'; counter++){} 

であなたのカウンターを開始名。例えば:forループ上記5.

for (;counter > 0; counter--){cout << name[counter-1]; }

で、今あるあなたはハローカウンタを入力した場合、あなたは最初の反復あなたのため、その後は逆に、あなたの配列の各文字をプリントアウト5でカウンタの値を持つことから始めますカウンタが5の場合は、名前[4]を出力してカウンタを減らし、名前[3] = l、次に名前[2] = l、 を入力し、[1] = eと名付け[0] = h 。注:カウンターが値nにある場合、n-1を印刷しています。カウンタが1に減少すると、名前[0]が表示されます。カウンタは最終的に0にデクリメントしてループが偽になります。また、配列要素自体を逆にするのではなく、逆にそれらを印刷するだけです。

-1

プログラムでは、最初のループはname変数の文字数を知ることです。 どのように動作するか説明しましょう。ループについて
がため
ような基本的な構造を有する式(I = 10、I> 0; i--)
まずパートI = 0が初期化、第二部である
{
ための
//ボディ部分} 3番目の部分はインクリメント/デクリメントです。
プログラムでは、すでにカウンタの値を0に初期化しています。
このループは文字数をカウントするためのもので、ループカウント変数が増えるたびにカウントされます。身体部分に何かを書く必要はありません。

の最初のforループカウント変数は、name変数の文字と同じ値を持っています。
また、2番目のループでは、countにすでに値が格納されているため、カウント値を初期化する必要はありません。

希望しています。

-1
#include <iostream> 
using namespace std; 

int main() 
{ 
    char name[99]; 
    int counter=0; // variable to store the number of characters in name. 

    cin >> name; 

    // the for loop is counting each letter until the end of the string, storing the result in counter. 
    for(;name[counter]!='\0'; counter++) 
    {} 

    cout << "\nName: "; 

    // if the name you entered was "Billy" counter would = 5 
    for (;counter > 0; counter--) 
    { 
     // since counter = 5 counter subtracts 1 to get to the "5th" spot in the array which is when counter = 4 
     // name[0] = B 
     // name[1] = i 
     // name[2] = l 
     // name[3] = l 
     // name[4] = y 
     // now starting from position 4 in the array counter-- subtracts 1 
     // from counter each time it runs through the loop to get to each previous letter. 
     cout << name[counter-1]; 
    } 
} 
関連する問題