2015-12-27 2 views
-3

Я делаю программу, и часть ее цели заключается в том, что она должна иметь возможность разделить ввод на отдельные строки на основе символов. Например,Сбой программы через 5 секунд после ввода?

game.Lighting разделяется на «игру» и «Освещение» game.Properties.Hey разделяется на «игры» и «Свойства» и «Эй» В принципе, это просто убирает. и разделяет их на разные строки.

Однако, когда я входной то, что я хочу, чтобы строка быть, она работает, и делает это совершенно нормально, а затем выходит из строя около 5 секунд с ошибкой «Струнный ул была повреждена»

Это мой код.

#include "stdafx.h" 
#include <string.h> 
#include <iostream> 
#include <Windows.h> 

using namespace std; 
int main() 
{ 
    char str[2] = "."; 
cin >> str; 
char * pch; 
printf("Splitting string \"%s\" into tokens:\n", str); 
pch = strtok(str, "."); 
while (pch != NULL) 
{ 
    printf("Getting %s then ", pch); 
    pch = strtok(NULL, "."); 
} 
Sleep(5000); 
return 0; 
} 

Я изменил char str [] = "." to char str [2] = "."

Однако, сейчас я получаю сообщение об ошибке (это после того как программа была составлена ​​и побежал, то он выходит из строя) «ул Строка была повреждена»

+1

Вы забыли поставить свое освещение на орбиту. –

+1

Что @LightnessRacesinOrbit – JStep

ответ

4

str только оставляет место для двух байтов, как "." является char[2] , Это слишком мало места для любой C-строки длиннее одного символа («один», а не «два» из-за нулевого байта), и поэтому возможно появление неопределенного поведения.


Ваше использование C++, поэтому напишите свой код соответствующим образом! strtok - C. printf C. C. char[] C. Используйте вместо этого объекты C++!
Определите std::string, а затем прочитать в него с помощью std::cin:

std::string str; 
std::cin >> str; 

strtok может быть легко реализован в хорошем C++ с std::find, std::string::find, std::for_each, или какой-то подобной функции полезности.

Я придумал это, в надежде не нуждаясь быть стыдно за себя слишком плохо:

std::size_t pos = 0, tmp; 
while ((tmp = str.find('.', pos)) != std::string::npos) { 
    str[tmp] = '\0'; 
    std::cout << "Getting " << str.substr(pos) << " then "; 
    pos = tmp; 
} 
std::cout << "Getting " << str.substr(pos) << " then "; 

Поскольку C++ 11, мы имеем <chrono> и <thread>. Ура! Используйте что-то вроде этого вместо этого некрасиво, переносимых Sleep:

std::this_thread:sleep_for(std::chrono::milliseconds(5000)); 

Программирование на Windows, автоматически не означает никого писать переносимый код!

Примечание что все эти функции могут использоваться в C++, но не принадлежат к нормальной, хорошо написанной программе C++ (11).

+0

Все еще получаю ошибку: u – JStep

+0

@JStep Ваши изменения? Напишите их в своем вопросе, пожалуйста. – Downvoter

+0

добавил, извините – JStep

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