Помогите найти ошибку . С++ . Строки

62
16 января 2022, 23:10

Задание: С клавиатуры вводится строка символов состоящая из нескольких слов, необходимо вычислить и вывести на экран количество символов каждой лексемы (слова). В качестве разделителя используется одиночный пробел.

Код:

#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;
        }
    }
}
Answer 1
cin >> str;

читает только одно слово (см. учебник или справочник по С++).

Читать строку полностью можно с помощью функции getline:

cin.getline(str,100);
Answer 2

Программа ничего не считает, потому что вы не ввели счётчик. Для того, чтобы она считала, надо где-то хранить данные о количестве найденных слов. Но необходимой переменной я так и не увидел, увы. Кроме того, вы каждый раз печатаете строку заново, по тому она и будет выводить вам уже найденные слова. Для того, чтобы такого не было, нам надо запоминать индекс, на котором было встречено предыдущее слово и выводить все символы начиная с него и до текущего пробела. И кстати последнее слово оно вам тоже считать не будет, потому что по умолчанию пробел в конце не добавляется. В общем исправленная версия программы должна будет выглядеть как-то так:

#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

Answer 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;
}
Answer 4
#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;
            }
        }
    }
READ ALSO
не работает seekg

не работает seekg

Нужно пройтись по файлу 2 раза, чтоб узнать его размер, а потом прочитатьПроблема в том, что seekg(0) не сбрасывает указатель на элемент файла...

75
(C++) Разделить строку на несколько слов

(C++) Разделить строку на несколько слов

Как возможно реализовать разделение строки без использования стандартных библиотек C++?

62
с++: прекратить выполнение всех потоков

с++: прекратить выполнение всех потоков

Формирую задачу, которая будет выполняться в нескольких потоках с помощью stl следующим образом:

79
Проблема обработки строк в с++

Проблема обработки строк в с++

Есть задание на написание программы, которая обрабатывает текстовый файл со строками такого вида:

82