C++ 程序在输入5秒后崩溃?

C++ 程序在输入5秒后崩溃?,c++,C++,我正在制作一个程序,它的部分目的是,它需要能够根据字符将输入分离成单独的字符串。 比如说, 游戏。照明分为“游戏”和“照明” game.Properties.Hey分为“game”和“Properties”以及“Hey” 基本上,它只是删除了。并将它们分成不同的字符串 然而,当我输入我想要的字符串时,它工作正常,并且做得很好,然后在大约5秒钟后崩溃,出现错误“string str已损坏” 这是我的密码 #include "stdafx.h" #include <string.h> #

我正在制作一个程序,它的部分目的是,它需要能够根据字符将输入分离成单独的字符串。 比如说,

游戏。照明分为“游戏”和“照明” game.Properties.Hey分为“game”和“Properties”以及“Hey” 基本上,它只是删除了。并将它们分成不同的字符串

然而,当我输入我想要的字符串时,它工作正常,并且做得很好,然后在大约5秒钟后崩溃,出现错误“string 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;
}
#包括“stdafx.h”
#包括
#包括
#包括
使用名称空间std;
int main()
{
字符str[2]=”;
cin>>str;
char*pch;
printf(“将字符串\%s\”拆分为标记:\n”,str);
pch=strtok(str,“.”);
while(pch!=NULL)
{
printf(“然后获取%s”,pch);
pch=strtok(空,“.”);
}
睡眠(5000);
返回0;
}
我将char str[]=“”更改为char str[2]=”


但是,我现在得到了错误(这是在程序编译并运行之后,然后崩溃)“String str已损坏”

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


<>你使用C++,所以相应地编写你的代码!代码> Strutok <代码>是C.<代码> Prtff <代码>是C.Cuth> Car []/Cord>:C,使用C++工具代替!br> 定义一个
std::string
,然后使用
std::cin
读入它:

std::string str;
std::cin >> str;
< > >代码> Strtok> /Cord>可以很好地在C++中使用<代码> STD::查找< <代码> >代码> STD::String::查找< /COD>,<代码> STD::FuyAuth/<代码>,或一些类似的实用函数。

我想到了这个,希望不必太为自己感到羞耻:

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 ";

在Windows上编程并不自动意味着任何人都要编写不可移植的代码


<> >强>注<强>所有这些函数都可用在C++中,但不属于正常的、写得好的C++(11)程序。

你忘记把你的照明放进轨道。什么?LightnessRacesinOrbit@JStep你的变化?请把它们写在你的问题中。@JStep-Uhm,你读过我的答案,是吗?由于方括号内的
2
可以很好地省略,因此您的程序实际上根本没有改变。阅读我的答案,润色你的代码,然后再试一次。
std::this_thread:sleep_for(std::chrono::milliseconds(5000));