Алгоритм инициализации c ++ 11 - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь написать код, который печатает инициалы строки. Но у меня есть проблема в одном случае, когда эти имена состоят из более чем одного символа пробела, и я придумал идею удалить эти символы пробела, которые не нужны, и оставить только одно пробел, но я Я еще не уверен в струнах, и может кто-нибудь сказать мне, что мне делать?



#include <iostream>
#include <string>
#include <cctype>

std::string initials(const std::string &w )
{
    char space = ' ';
    std::string a;
    a.push_back(w[0]);
    for (int i = 0; i < w.size(); ++i)
    {
        if (w[i] == space )
        {
            a.push_back(w[i+1]);


        }

    }
    return a;
}

int main()
{
    std::cout<<  initials(std::string("Julian     Rodriguez        Antonio "))<<std::endl;

}

1 Ответ

2 голосов
/ 06 мая 2020

Можно сохранить в памяти информацию, был ли последний символ пробелом или нет ..

#include <iostream>
#include <string>
#include <cctype>

std::string initials(const std::string &w) {
    char space = ' ';
    std::string a;
    int mode = 0;
    for (int i = 0; i < w.size(); ++i) {
        if (w[i] == space) {
            mode = 0;
        } else {
            if (mode == 0) a.push_back(w[i]);
            mode = 1;
        }
    }
    return a;
}

int main()
{
    std::cout<<  initials(std::string(" Julian     Rodriguez        Antonio "))<<std::endl;
}

РЕДАКТИРОВАТЬ : благодаря предложению Пита Беккера, вот более четкая реализация.

std::string initials(const std::string &w) {
    char space = ' ';
    std::string a;
    bool skipping_spaces = true;
    for (int i = 0; i < w.size(); ++i) {
        if (w[i] == space) {
            skipping_spaces = true;
        } else {
            if (skipping_spaces) a.push_back(w[i]);
            skipping_spaces = false;
        }
    }
    return a;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...