我正在制作一个程序,其中一部分目的是它需要能够根据字符将输入分成单独的字符串。 例如,
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已损坏”
答案 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;
使用strtok
,std::find
,std::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)程序。