Использование функции .find для поиска размера между символом и другим символом в c ++ - PullRequest
1 голос
/ 09 июля 2020

Мне нужна помощь с функцией поиска в C ++. Я искал и искал, но ничего из того, что я пробую, не работает правильно.

Вопрос:

Функция должна преобразовать эту дату в международный формат. Например: если получена строка «29 декабря 1953 г.», строка, которую должна вернуть функция, должна быть «29 декабря 1953 г.».

Кажется, я понимаю, что нужно для решения всего проблема, но я застреваю при запуске новой функции .find с начала даты до запятой. Мой код, кажется, все еще находит позицию запятой от начала строки, а не от первого символа после пробела.

#include <iostream>
#include <string>
using namespace std;
 
string convertDate(string dateP){
    int sizeOfString = dateP.size();
    int space = dateP.find(' ');
    space = space + 1;
    int comma = dateP.find(',', space);
    
    dateP = dateP.substr(space, comma);

    return dateP;
}

int main(){

    string date;

    cout << "Enter the date: " << endl;
    getline(cin, date, '\n');

    string newDate = convertDate(date);

    cout << endl;
    cout << newDate;

    return 0;
}

Ответы [ 2 ]

3 голосов
/ 09 июля 2020

Я искал и искал, но ничего из того, что я пробовал, не работает правильно.

Что ж, если вы ищете решение проблемы и хотите использовать то, чего у вас нет попробовал, то использование std :: istringstream делает код тривиальным:

#include <sstream>
#include <string>
#include <iostream>

std::string convertDate(std::string dateP)
{
   // create a stream from the passed-in string
   std::istringstream strm(dateP);

   // get the month, day and year from the stream
   std::string month, day, year;
   strm >> month >> day >> year;

   // get rid of the comma (the last character in the day string)
   day.pop_back();

   // put together the resulting string and return
   return day + " " + month + " " + year;
}

int main()
{
   std::cout << convertDate("December 29, 1953");
}

Вывод:

29 December 1953

Обратите внимание на отсутствие кода для поиска пробелов, или создание подстрок.

std::istringstream автоматически знает, как пропускать пробелы, аналогично std::cin, поэтому код для поиска пробелов не требуется.

Функция pop.back() удаляет последний элемент в строке. Поскольку предполагается, что ',' является последним символом в строке day, pop.back() просто удаляет его.

В конце мы просто склеиваем все части и возвращаем полученную строку.

0 голосов
/ 09 июля 2020

Вы можете сделать что-то вроде convertDate(string americanDate) вместо convertDate(string dateP), тогда:

#include <iostream>
#include <string>
using namespace std;

string convertDate(string americanDate)
{
    int blank = americanDate.find(" ");
    string month = americanDate.substr(0, blank);
    int comma = americanDate.find(",");
    string day = americanDate.substr(blank+1, comma-blank-1);
    string year = americanDate.substr(comma+2, americanDate.size());
    string date = day+ " "+ month + " " + year;
    return date;
}

int main()
{
    string americanDate;
    cout <<"Enter the date: ";
    getline(cin,americanDate);
    string newDate = convertDate(americanDate);
    cout << newDate;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...