程序在输入后5秒崩溃?

时间:2015-12-27 21:14:20

标签: c++

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

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

然而,当我输入我想要的字符串时,它可以工作并完全正常,然后在大约5秒后崩溃并出现错误“String str was corrupted”

这是我的代码。

#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] =“。”

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

1 个答案:

答案 0 :(得分:4)

str仅保留两个字节的空间,因为"."char[2]。对于长度超过一个字符的任何C字符串而言空间太小(&#34;一个&#34;不是&#34;两个&#34;由于空字节),因此可能会发生未定义的行为。< / p>

您使用C ++所以请相应地编写代码! strtok是C. printf是C. char[]是C.使用C ++工具代替! 定义std::string,然后使用std::cin

进行阅读
std::string str;
std::cin >> str;

使用strtokstd::findstd::string::find或类似的实用功能,可以在精美的C ++中轻松实现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)程序。