сообщение об ошибке печати после обнаружения третьей подстроки - PullRequest
0 голосов
/ 09 мая 2020

Здравствуйте, я новичок в C ++. У меня вопрос по разделению строки.

Например, у меня есть такая строка

std::string str = "jump 110 5";

и между строками "прыжок", "110" и "5" могут должно быть столько пробелов, сколько может быть.

Я хочу сохранить 110 в переменной int, и если после числа 110 должно появиться другое число или символ, то l oop должно сломаться.

Пока что я удалил все пробелы и сохранил 110 в переменной и распечатал его, а число пять было проигнорировано.

Как я могу разбить или распечатать сообщение об ошибке после 110, говоря, что строка является недействителен?

Вот мой код:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

int main() {

    std::string str = "jump 110 5";
    size_t i = 0;
    for ( ; i < str.length(); i++ ){ if ( isdigit(str[i]) ) break; }    

    str = str.substr(i, str.length() - i );    

    int id = atoi(str.c_str());
    std::cout<<id;

     return 0;    
}

1 Ответ

0 голосов
/ 09 мая 2020

РЕДАКТИРОВАТЬ: Вторая попытка .. Вот что я написал, чтобы преобразовать значения в вектор. если вектор содержит более одного набора чисел, он печатается и выдает ошибку.

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>


int main() {

    std::string str = "jump 110 5";
    size_t i = 0;
    for (; i < str.length(); i++)
    {
        if (isdigit(str[i]))
            break;
    }

    str = str.substr(i, str.length() - i);


    // Parse str to id
    std::stringstream sstr;
    sstr << str;
    std::string tempStr;
    std::vector<size_t> id;   

    while (std::getline(sstr, tempStr, ' '))
    {
        std::cout << tempStr << std::endl;
        id.push_back(std::stoi(tempStr));
    }

    // print an error if additional numbers are in id
    if (id.size() > 1)
    {
        std::cout << "Error: " << id[1];
    }
    else
    {
        std::cout << "You're good";
    }

    return 0;
}

Внимание: ошибка возникает, если между 110 и 5 больше одного пробела.

Исходный ответ: Если вы хотите, чтобы id имел значение 110 5, тогда id не должен быть типом int, потому что он не может содержать пробелов. Если вы хотите, чтобы id имел значение 1105, вам нужно избавиться от пробелов в строке «110 5» перед присвоением его id, иначе значение будет усечено при назначении id. .

Это то, что я сделал, чтобы избавиться от пробелов и сделать id равным 1105.

#include <iostream>
#include <fstream>
#include <string>
#include <vector>


int main() {

    std::string str = "jump 110 5";
    size_t i = 0;
    for (; i < str.length(); i++)
    {
        if (isdigit(str[i]))
            break;
    }

    str = str.substr(i, str.length() - i);

    // get rid of spaces
    std::string tempStr;
    for (int i = 0; i < str.length(); i++)
    {
        if (str[i] != ' ')
        {
            tempStr.push_back(str[i]);
        }
    }

    // Set the str object to tempStr
    str = tempStr;

    int id = atoi(str.c_str());
    std::cout << id;


    return 0;
}

Если вам действительно нужно сохранить id как int и разделите 110 и 5, тогда я бы предложил преобразовать id в std::vector и преобразовать строку в вектор.

...