2012-02-25 11 views
0

私の割り当てのためにC++でコードをプログラムしようとしています。アレイに余分なデータが格納されているのはなぜですか?

メインと関数のデータを受け入れる必要がある部分の1つは、メインで送信した配列の最初の部分を取得して関数の配列に入れなければならないことです。

 for (int i = 0; i <= strlen(main) && exit == 0; i++){ 
     if (main[i] != ';' || main[i] != '\0'){ 

     keyword[i] = data[i]; 
     if(main[i] == ';' || main[i] == '\0') 
     exit = 1; 

     } 

この

は、指定された配列内のコードである main = "Hello World;Yes;No;Okay;Good Bye",

だから私は私の配列のHello Worldkeywordと呼ばれることを保存したいですが起こると私は私が後に余分なデータを参照して、キーワード文字列をprintfの後、問題が何でありますか単語Hello World

ここでは、私はprintfの

Your keyword-----> 'Hello World;? ' Actual keyword---> 'Hello World'

に持っているものです

私のロジック使用上の問題はありますか?

おかげ

+0

私は、残りのコードを確認する必要がありますが、私の推測では、 'キーワード'は 'char *'(例えば 'std :: string'ではなく)です。この場合、for-loopが終了したときに、 'keyword'の最後に' '\ 0''を1つ追加する必要があります。 – jogojapan

+0

私はあなたの質問を本当に理解しませんでしたが、文字 ';'に遭遇すると、breakキーワードを使ってforループを終了することができます。キーワードに 'hello world'が含まれています – Pramod

+0

@Pramod break;私の割り当てで許可されていないので、ループを中断するためにexit変数を使用しています。 – Ali

答えて

2

i <= strlen(main)i < strlen(main)へのニーズやif内の余分な終端文字チェックの必要がありません。また、必要なデータをコピーした後にkeywordがヌルで終わることを確認してください(\0)。

目的地がコピーされるデータを保持するのに十分な大きさであると仮定して、ちょっと考えてみましょう。

for (int i = 0; i < strlen(main) ; i++) 
    if (main[i] != ';'){ 
     keyword[i] = data[i]; // Copy the characters until `;` isn't found 
    } else { 
     keyword[i] = '\0' ; // If `;` found, null terminate the copied destination. 
     break; 
    } 
} 
+0

'あなたのキーワード-----> 'Hello World ;?' 実際のキーワード---> 'Hello World'' – Ali

+1

アップデートをご覧ください。 – Mahesh

+1

これはロジックをはるかに簡単にすると思う最良のソリューションです。 私はこれを考えようとしていましたが、実際には考えていましたが、実際には単純なことは考えていませんでした.... ありがとう! – Ali

1

余分なデータはおそらくヌル終了文字です。あなたは

i <= strlen(main) 

を使用している 注これは実際にはすべての文字に加えてヌル終了を出力します。

i < strlen(main) 

一般に、あなたが何をするかをよりよく理解するためには、もう少し多くのコードが役立ちます。

if(main[i] != ';' && main[i] != '\0') 
+0

@Begemothのコメントを参照してください。データの中には ''; ''がまったく含まれていないかもしれないので、' || 'を使用しなければなりません。 – Ali

1

if (main[i] != ';' || main[i] != '\0') 

は常に真である条件、あなたがどうかをテストしたい:

しかしbegemothとして

は、あなたがやりたいことのためにあなたの場合は()のテストがあるべきと思われると述べました文字は ';'ではない'\ 0'でないので、( or)ではない &&演算子( and)でテストを接続する必要があります。

いくつかの注意:

  1. strlen関数は、文字列の長さを決定するか、または*main[i]でテストを置き換えるためにループの前に一度、それを呼び出すために優れているO(N)の複雑さを持っています。

  2. exit変数は冗長ですので、breakを使用してください。

+0

私は' ''なぜなら、この場合、 '||'を使用しなければならない理由があるからです。 – Ali

+0

@Ali、私はあなたが何を理解しているのですか? main [i] == ';' '' main [i]!= ';' 'は '0'、' main [i]!= '\ 0''は1に等しく、 '0 || 1 'は1に等しい。同じ理由が 'main [i] ==' \ 0 ''の場合に当てはまる。あなたの状態は常に真です。 – Begemoth

+0

それでもベベモスは正しいです。自然言語では、ORと言ってもブール論理で試してみてください。あなたの頭の中でちょっと確認してください。 Btw Ali、これは多くの人のコードで最も頻繁に発生するバグの原因の1つです。このブール条件を誤解し、|| && – Lefteris

関連する問題