-1
私はC++プログラムを作成しようとしていましたが、これはユーザーが好きな文字数を入力することができます(メモリが使える限り)。そしてEnter(ASCII Number:13)を押すと、ユーザーが入力した文字列全体を表示します。このプログラムは無限の入力行のように動作しないのはなぜですか?
しかし何らかの理由で、プログラムが与えた文字の入力が多すぎても、ユーザーが入力した文字列全体が表示されません。私のWindowsリソースモニターでは、プログラムでメモリリークが発生していることが示されています。数秒でクリーンアップされますが、私のプログラムで何が問題なのかを本当に知りたいのです。ここアドバンス
で
おかげで私の全体のソースコードです:
#include<iostream.h>
#include<conio.h>
int main()
{
int ctr = 0, n = 10, counter = 0;
char *stloc = NULL, *ptr = NULL, *cptr = NULL; // creating a NULL pointer
ptr = new char[n]; // get an array of 10 bytes allocated in heap memory
while((int)(*ptr) != 13) // Take input till Enter Key is pressed
{
if(counter == (n+ctr-1)) // Check if array overflow is going to happen
{
ctr+=2; // add two to ctr so that an extra 2 byte space is created in the new char array for a character and '\0'
cptr = new char[n+ctr];
strcpy(cptr,ptr);
delete [] ptr;
ptr = cptr;
stloc = ptr;
}
*ptr = getche();
ptr++;
counter++;
}
*ptr = '\0';
cout << endl << stloc;
delete [] ptr;
system("pause");
}
ユーザーからの入力はどこにありますか?また 'std :: string'を使わないのはなぜですか?あなたのプログラム全体を 'std :: string input; std :: getline(std :: cin、input); ' – NathanOliver
' ptr'をイテレータとして使うためにポインタ演算をしているので、 'delete ptr'を呼び出すことは非常に悪い考えです。そしてあなたの文字列の始まりではないので、 'strcpy(cptr、ptr)'を呼び出してメモリの内容を転送することも悪い考えです。結局のところ、各サイズ変更と内容の上書きの後に、文字列の先頭に 'ptr'をリセットしています。 – paddy
Cランタイムライブラリは、の戻り値 を改行文字( ''\ n'')に変換し、そのASCIIコードは13ではありません...そして、* ptrをテストする瞬間、ptrは初期化されていない値を指しています!最初の実行時には何も読み込まれておらず、次のものではptrを増やしただけです。特別な要件がない限り、conioの使用をやめ、C++のチュートリアルに従ってください。 –