Задание: С клавиатуры вводится строка символов состоящая из нескольких слов, необходимо вычислить и вывести на экран количество символов каждой лексемы (слова). В качестве разделителя используется одиночный пробел.
Код:
#include <iostream>
#include <conio.h>
#include <string>
#include <cstring>
using namespace std;
int main()
{
setlocale(LC_ALL, "rus");
cout << "Введите строку: ";
char str[100]; //
cin.getline(str, 100);
int size = strlen(str); // Размер массива str
for (int i = 0; i < size; i++)
{
if (str[i] == ' ')
{ // Поиск пробелов
cout << endl;
}
else
{
cout << str;
}
}
}
cin >> str;
читает только одно слово (см. учебник или справочник по С++).
Читать строку полностью можно с помощью функции getline
:
cin.getline(str,100);
Программа ничего не считает, потому что вы не ввели счётчик. Для того, чтобы она считала, надо где-то хранить данные о количестве найденных слов. Но необходимой переменной я так и не увидел, увы. Кроме того, вы каждый раз печатаете строку заново, по тому она и будет выводить вам уже найденные слова. Для того, чтобы такого не было, нам надо запоминать индекс, на котором было встречено предыдущее слово и выводить все символы начиная с него и до текущего пробела. И кстати последнее слово оно вам тоже считать не будет, потому что по умолчанию пробел в конце не добавляется. В общем исправленная версия программы должна будет выглядеть как-то так:
#include <iostream>
#include <conio.h>
#include <string>
#include <cstring>
using namespace std;
int main()
{
setlocale(LC_ALL, "rus");
cout << "Ââåäèòå ñòðîêó: ";
char str[100]; //
cin.getline(str, 100);
int size = strlen(str); // Ðàçìåð ìàññèâà str
int k = 0, m = 0;
for (int i = 0; i < size; i++)
{
if (str[i] == ' ' || i+1 == size)
{ // Ïîèñê ïðîáåëîâ
for(int j = m; j <= i; j++ )
{
cout << str[j];
}
cout << endl;
k++;
m = i+1;
}
}
cout << k << endl;
}
При входных данных например: word1 word2 word3 выходные данные будут : word1 word2 word3 3
Для решения Ваше задачи воспользуйтесь std::istringstream.
При работе этим потоков Вы можете разбить строку на лексемы в std::string, а у него уже есть метод size
Вот пример : Вместо ввода, я захардкодил строку....
#include <iostream>
#include <string>
#include <sstream>
int main() {
std::string str("a bb ccc dddd");
std::istringstream ist(str);
std::string tmp_str;
while (ist >> tmp_str) {
std::cout << "word [ " << tmp_str << " ], size : " << tmp_str.size() << std::endl;
}
return 0;
}
#include <iostream>
#include <conio.h>
#include <string>
#include <cstring>
using namespace std;
int main() {
setlocale(LC_ALL, "rus");
cout << "Введите строку: ";
char str[100]; //
cin.getline(str, 100);
strcat(str, " ");
char last = ' ';
int lsize = 0;
for (char* c = str; *c; ++c) {
if (*c == ' ') {
if (last != ' ') {
cout << " : lexem size = " << lsize << endl;
last = ' ';
}
}
else {
if (last == ' ') {
lsize = 1;
last = *c;
}
else lsize++;
cout << *c;
}
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Нужно пройтись по файлу 2 раза, чтоб узнать его размер, а потом прочитатьПроблема в том, что seekg(0) не сбрасывает указатель на элемент файла...
Как возможно реализовать разделение строки без использования стандартных библиотек C++?
Формирую задачу, которая будет выполняться в нескольких потоках с помощью stl следующим образом:
Есть задание на написание программы, которая обрабатывает текстовый файл со строками такого вида: