这更像是一个正确的帖子,汉斯有你的问题。
获取一行输入的正确方法是getline:
std::string s;
std::getline(std::cin, s);
std::cin无论如何都会在空白处中断,所以如果你输入asd 123并运行你的代码,input_line首先是“asd”,然后是循环中的第二次“123”(不等待输入)。
也就是说,获得结果的一种简单方法是使用stringstream. 任何时候你明确分配内存,尤其是使用malloc,你可能正在做一些艰难的事情。这是标记字符串的一种可能解决方案:
#include <sstream>
#include <string>
#include <iostream>
int main(void)
{
std::string input;
std::getline(std::cin, input);
std::stringstream ss(input);
std::string token;
while(std::getline(ss, token, ' '))
{
std::cout << token << "...";
}
std::cout << std::endl;
}
如果你真的想使用strtok,你可以这样做:
#include <cstring>
#include <string>
#include <iostream>
#include <vector>
int main(void)
{
std::string input;
std::getline(std::cin, input);
std::vector<char> buffer(input.begin(), input.end());
buffer.push_back('\0');
char* token = strtok(&buffer[0], " ");
for (; token; token = strtok(0, " "))
{
std::cout << token << "...";
}
std::cout << std::endl;
}
请记住,手动内存管理是不好的。使用 a vectorfor 数组,可以避免泄漏。(你的代码有!)