私はこれを後悔するつもりですが、この質問を見るたびに、あなたのコードに間違ったことがあります。ここにラインごとにあります。私はおそらく多くを逃したでしょう。
このヘッダーの正しい名前は、 "iostream.h"ではなく "iostream"です。 ".h"バージョンは非推奨です。同様に、最新のC++では "string.h"ではなく "string"を使用し、現代のSTL文字列クラスを使用します。
#include <iostream.h>
#include <conio.h>
#include <string.h>
このようにしないでください。標準bool
タイプを標準タイプと反対の値に再定義しました。私はこれが合法であることを知らない。
enum track {true, false};
main
関数の戻り値はint
、ないvoid
あります。
void main()
{
clrscr();
バッファオーバーフローは何ですか?割り当てられたメモリを持たずにここにポインタとしてstr
を定義し、その未定義のビットに後で書き込みを行います。これは未定義の動作で、クラッシュすることはほとんどありません。私は、あなたがstd::string
としてstr
を定義することをお勧めします。これはうまくバッファオーバーフローを回避し、あなたのプログラムで使用できる多くの便利な方法があります。
char*str;
enum track track_pos, track_pos_2;
cout<<"enter the string: ";
ここはバッファオーバーフローです。あなたは誰がどの領域の記憶を知っているかを書いています。 str
がstd::string
た
cin>>str;
場合 - あなたはsize_t len=str.length()
を行うだろう。
int len=strlen(str);
cout<<"length of the string is "<<len;
これはおそらく、入出力ストリーム機能で、このようなコンソールIO機能をミックスするのは良い考えではありません - 困難につながることができ、いくつかのバッファリングの問題があります。あなたは再びそれを使用していないので、
getch();
は、ループの本体にi
を宣言します。
for (int i=0; i<len; i++) etc...
int i;
for(i=0;i<len; i++)
{
代わりのpoiter演算を使用して、あなただけのものを使用し、配列としてstr
を扱う、i
内の現在の文字のインデックスを追跡しているので:そうのように。この方法では、str
をi
と同期させておく必要はありません。これは、あなたが報告しているバグの原因です。
++str;
cout<<"loop"<<i;
あなたはこれを変更する必要があります(str
は、ポインタ演算のバージョンとは異なり、やり方によってstd::string
場合でも動作すること)
if (str[i]=='a' && i%2==0)
。
if(*str=='a' && i%2==0)
{
は、あなたは本当にあなたが文字列が一致していないことを把握場合は、文字列の末尾に起こっても意味がありません、いくつかの点でドロップアウトしなければなりません。
cout<<"\nchecking a...";
私はこのような状態フラグを支持していない - あなたのコードは、これらのフラグの増殖、あなたが適切な行動を追跡することはできませんので、理解することは、部分的には困難です。 track_pos
という名前はニーモニックではないので、コードの詳細な調査がなければ、それが意味する意味を理解することが難しくなります。
forループの本体の中のコードをリファクタリングして関数を呼び出すことをお勧めします。その目的は単に "ab"という単一のグループに一致させることです。そうでない場合はfalseを返します。
track_pos=true;
cout<<"\na.check";
前述のバッファオーバーフローを処理しているので、未定義のメモリを繰り返していることに注意してください。また、i
を増やしていないことにも注意してください。
++str;
if (*str=='b')
{
cout<<"\nchecking b...";
track_pos=true;
cout<<"\nb.check";
}
else{
track_pos=false;
cout<<"\nb.uncheck";
}
}
}
我々はここに到達すると、あなたのforループによると、我々は文字列全体を繰り返してきたので、私たちは(でもバッファオーバーフローを無視して)、文字列の末尾を過ぎて見なければなりませんので、何の可能な方法はありませんこのテストは成功する可能性があります。一言で言えば、あなたのforループはあまりにも遠くになっているはずです。
if(*str=='b')
track_pos_2=true;
else
track_pos_2=false;
if(track_pos==true && track_pos_2==true)
スペルミスを教えてください。
cout<<"\nThe string is accpeted.";
else
cout<<"\nThe string is rejected.";
getch();
cout<<"\n\nDo you want to continue (Y/N)? ";
char ch;
cin>>ch;
コードを適切なサブルーチンにリファクタリングすると、プログラムの構造が自動的に処理されます。再帰的にmain
を呼び出すことは厳密には違法ではありませんが、プログラムが終了しない場合、最終的なスタックオーバーフローにつながる明らかな脆弱性があります。
if(ch=='y' || ch=='Y')
main();
}
が、それは...それはうち最も簡単な方法だった –
:-) :) – amit
私はmain' '再帰を参照してください最初の時間だ、それはC++で違法だ –