2017-03-20 7 views
-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"); 
    } 
+9

ユーザーからの入力はどこにありますか?また 'std :: string'を使わないのはなぜですか?あなたのプログラム全体を 'std :: string input; std :: getline(std :: cin、input); ' – NathanOliver

+0

' ptr'をイテレータとして使うためにポインタ演算をしているので、 'delete ptr'を呼び出すことは非常に悪い考えです。そしてあなたの文字列の始まりではないので、 'strcpy(cptr、ptr)'を呼び出してメモリの内容を転送することも悪い考えです。結局のところ、各サイズ変更と内容の上書きの後に、文字列の先頭に 'ptr'をリセットしています。 – paddy

+0

Cランタイムライブラリは、の戻り値を改行文字( ''\ n'')に変換し、そのASCIIコードは13ではありません...そして、* ptrをテストする瞬間、ptrは初期化されていない値を指しています!最初の実行時には何も読み込まれておらず、次のものではptrを増やしただけです。特別な要件がない限り、conioの使用をやめ、C++のチュートリアルに従ってください。 –

答えて

0

あなたがテキストの行全体を読み取るためにstd::stringstd::getlineを利用することができます。これを行うことができる簡単なプログラムは次のようになります(どちら最初の改行文字である。):

#include <iostream> 
#include <string> 

using namespace std; 

int main() { 
    string myLine; 
    getline(cin, myLine); 
    cout<<myLine<<endl; 
} 

さらに読書のために、あなたはstd::stringstd::getlineのドキュメントを見ることができます。

関連する問題