AlexNineteen
@AlexNineteen
Привет.

Как правильно сделать разбиение строки по пробелам и добавление в массив?

Нужно входную строку разбить по пробелам и получившиеся подстроки положить в массив.
Я сделал это так:
  1. Создать динамический массив строк, состоящий из двух эл-ов
  2. В цикле пройтись по символам входной строки, если встречается пробел, то добавлять это слово в массив
  3. Создать временный динамический массив, для увеличения размера главного
  4. Вывести получившиеся подстроки и удалить массив
Мой код
#include "stdafx.h"
#include <iostream>

using namespace std;

int main() {
	char input[] = "Hello world! I am Alex! I'm from Russia\0";
	char *p = input;

	int index = 2;
	char **arr = new char*[index];
	int n = 0, m = 0;  // Индексы для управления массивом
                    // n - индекс подстроки в массиве
                   // m - индекс символа в подстроке

	while (*p) {
		if (*p != ' ' && *p) {
			arr[n][m] = *p;
			m++;
		}
		else {
			arr[n][m] = '\0';
			m = 0;

     // Увеличение массива
			char **temp = new char*[index];
			for (int i = 0; i < index; i++) {
				temp[i] = arr[i];
			}
			arr = new char*[index++];
			for (int i = 0; i < index-1; i++) {
				arr[i] = temp[i];
			}

			delete[] temp;
		}
		p++;

 // Вывод подстрок
	for (int i = 0; i < index; i++)
	{
		cout << arr[i] << endl;
	}

	delete[] arr;

	return 0;
}


Но этот код с ошибкой:
Скриншот с ошибкой
5b9915f007d80943197993.png
P.S. Буду рад, если предложите более короткий вариант
  • Вопрос задан
  • 9192 просмотра
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C++
Ну если вам прямо по пробелу, и если действительно на C++, то вот:
#include <iostream>
#include <sstream>
#include <vector>

int main()
{
	std::istringstream input{ "foo bar baz qux" };
	std::vector<std::string> result;

	// extract substrings one-by-one
	while (!input.eof()) {
		std::string substring;
		input >> substring;
		result.push_back(substring);
	}

	// print all the extracted substrings
	for (const std::string& substring : result) {
		std::cout << substring << std::endl;
	}
}


А вообще тут столько вариантов, что и не сосчитать (есть даже более короткий вариант с использованием std::copy).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Я не так давно реализовал свой вариант: https://github.com/vt4a2h/str_utils
Ну и в интернетах есть куча вариантов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы