2016-07-11 6 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

Похоже, вам, возможно, потребуется научиться использовать отладчик для перехода через ваш код. С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого. Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: ** [Как отлаживать небольшие программы] (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); 

Это известно как неопределенное поведение: запись на неизвестный адрес. Хорошая операционная система и платформа будут segfault.

В компьютерном программировании, вам нужно выделить память, либо с помощью массива:

char s[256]; 

или динамическое распределение:

string s = new char[256]; 

, прежде чем положить значения в, либо из входных или в другом месте.

+1

Или используйте 'std :: string', как здравомыслящий человек –

3

Вы сказали это сделать. Удалить system("pause");

И, пожалуйста, прекратите использование библиотеки C и заголовков/инструментов 1980-х годов. Мы перешли от MS DOS в промежуток времени. Если вы хотите приобрести товарные навыки, изучите фактический ISO C++ (который был изобретен в 1998 году и обновлен три раза за почти два десятилетия с тех пор).

Смежные вопросы