2015-12-27 47 views
-3

我正在制作一个程序,其目的之一就是它需要能够根据字符将输入分隔成不同的字符串。 例如,输入后5秒程序崩溃?

game.Lighting被分离成“游戏”和“照明” game.Properties.Hey被分离成“游戏”和“属性”,“嘿” 基本上,它只是删除了。并将它们分成不同的字符串。

然而,当我输入我希望字符串是,它的工作原理以及它是否已完全正常,然后崩溃约5秒后出​​现错误“字符串str已损坏”

这是我的代码。

#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 [] =“。”以char str [2] =“。”

不过,我现在得到的错误(这是后该程序已编译并运行,然后它崩溃)“字符串str已损坏”

+1

你忘了把你的照明放入轨道。 –

+1

什么@LightnessRacesinOrbit – JStep

回答

4

str只保留空间,两个字节"."char[2] 。对于任何长度超过一个字符的C字符串来说空间太小(由于空字节,“一”不是“两”),因此可能会发生未定义的行为。


您使用C++如此编写相应的代码! strtok是C. printf是C. char[]是C.反而使用C++设施!
定义std::string,然后读入它使用std::cin

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

strtok所述可以很容易地在很不错的C来实现++与std::findstd::string::findstd::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