Это скорее корректный пост, у Ганса есть ваша проблема.
Правильный способ получить строку ввода - 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;
}
Помните, что ручное управление памятью плохо. Используйте vector
для массивов, и вы избежите утечек. (Какой у вас код!)