2016-07-11 1 views
0

プログラム自体が正しく動作し、それが想定されている(文中の単語を分離して印刷します)、クラッシュしません。しかし、私はプログラムを終了することはできません。それはちょうど立ち往生する。私は最後に出口(0)を与えようと試みたが、うまくいかなかった。Turbo C++プログラムがスタックする

どうしたらいいのですか教えてください。

#include<iostream.h> 
#include<conio.h> 
#include<stdio.h> 
#include<ctype.h> 
#include<string.h> 
#include<process.h> 

typedef char* string; 

void main() 
{ 
clrscr(); 

string s; 

cout << "\nEnter something : "; 
gets(s); 

int i; 

for (i = 0; i < strlen(s); ++i) 
{ 
if (s[i] != 32)// && (!isalnum(s[i-1]) || i == 0)) 
{ 
    char *word = s; 
    int end = 0; 

    for (; s[i] != 32 && i < strlen(s); ++i); 

    if (i == strlen(s)) end = 1; 
    else * (word + i) = '\0'; 

    cout << "\n" << word; 

    if (end) break; 

    strcpy(s, s+i+1); 
    i = -1; 
} 
} 

}

+2

デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。詳しい読書:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+0

申し訳ありません、私の最初のプログラムは、 "一時停止")、私はそれを削除しました。しかし、それでも問題は解決しません。プログラムはまだ終了しません。 –

+0

私はこの古いCライブラリを使うのは良くないと知っていますが、私はオプションがありません。 Turbo C++は私の学校のコンピュータサイエンスのための必須のコンパイラなので、私はそれを使わなければなりません。 –

答えて

3

未定義の動作

あなたは、ポインタを宣言し、(あなたはそれが何を指すことはありません)それを初期化しないでください:

string s; 
// a.k.a. char * s; 

次に、あなたはそれに入力:

gets(string); 

これは未定義の動作として知られています。未知のアドレスへの書き込みです。すばらしいオペレーティングシステムとプラットフォームがセグメンテーションされます。

は、コンピュータプログラミングでは、いずれかの配列を使用してメモリを割り当てる必要があります。

char s[256]; 

またはダイナミックアロケーション:

string s = new char[256]; 

あなたは内の値、入力からか、他の場所のいずれかを置く前に

+1

まともな人のように 'std :: string'を使用してください –

3

あなたはそれを行うためにそれを告げました。削除するsystem("pause");

そして、Cライブラリ、および1980年代のヘッダー/ツールの使用を中止してください。 MS DOSからその間に移動しました。市場性のあるスキルが必要な場合は、実際のISO C++(1998年に発明され、その後20年近くに3回更新されています)を学びます。

関連する問題