Как заполнить массив словами определенной длины?
Вот текст задачи: Реализовать метод, возвращающий массив слов длины N из заданной строки (знаки препинания, расположенные в начале и в конце слов, не учитывать). Если строка не содержит слов длины N, оставить результирующий массив пустым.
Итак, нужно
Пробежаться по введенной строке и узнать количество слов (я это сделал)
Создать массив для слов длины N (тоже сделано)
Вбить в этот массив слова длины N (тут уже возникли затруднения)
#include <iostream> #include <Windows.h> using namespace std; int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); int slovo = 0, count = 0, word_l; char s[80]; cout << "Введите строку: " << endl; cin.get(s, 80); cout << endl; cout << "Введите размер слов, которые вы хотите вывести: "; cin >> word_l; cout << endl; int i = 0; while (s[i] == ' ' && s[i] != '\0' && s[i] != ',' && s[i] != '.' && s[i] != '!' && s[i] != '?' && s[i] != ':' && s[i] != ';') { i++; } while (s[i] != '\0') { if (s[i] != ' ' && slovo == 0 && s[i] != ',' && s[i] != '.' && s[i] != '!' && s[i] != '?' && s[i] != ':' && s[i] != ';') { slovo = 1; count++; } else if (s[i] == ' ') { slovo = 0; } i++; } cout << "Всего слов в строке " << count << endl; char* arr = new char[i](); delete[] arr; return 0; }
P.S. еще нужно игнорировать пробелы и всякие знаки препинания, как вы могли понять по коду
Ответы (1 шт):
Вот пример кода с комментариями:
int count = 0, word_l;
const int size_word = 20; //Максимальный размер слова
const int count_words = 10; //Максимальное кол-во слов
const int size_str = 80; //Максимальная длина строки
char s[size_str];
char words[count_words][size_word];
cout << "Введите строку: " << endl;
cin.get(s, size_word);
cout << endl;
cout << "Введите размер слов, которые вы хотите вывести: ";
cin >> word_l;
cout << endl;
char* ps = s; //pointer s
char* pss = 0; //pointer start s - указатель на начало слова
int size = 0;
while (*ps != '\0') {
//Пропускаем знаки препинания и пробелы
while (*ps != '\0' && isDelimiter(*ps)) ++ps;
//Подсчитываем длину найденного слова
size = 0;
pss = ps;
while (*ps != '\0' && !isDelimiter(*ps)) {
++size;
++ps;
}
//Подсчитываем кол-во слов, длина которых = word_l и копируем в массив слов
if (size == word_l) {
strncpy_s(*(words + count), pss, word_l);
++count;
}
}
for (int i = 0; i < count; ++i)
cout << words[i] << endl;
Функция isDelimiter (делает код намного понятней)
bool isDelimiter(char s) {
return s == ' ' || s == ',' || s == '.' || s == '!' ||
s == '?' || s == ':' || s == ';';
}
Если вам не нравится, что массив words статический, то просто перед циклом while подсчитайте кол-во слов. Рекомендую при подсчете, так же считать и кол-во слов длинной равной n, чтобы потом инициализировать массив words получившиеся длинной.