почему этот код вызывает точку останова для определенного числа цифр? - PullRequest
0 голосов
/ 10 июня 2019

Я хочу разделить цифры данного номера 3 на 3.

Ввод: 1234567
Выход: 1 234 567

И я написал следующий код:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string StringIn;
    string::iterator it1, it2;
    cout << "Enter a number with any number of digits: ";
    cin >> StringIn;
    unsigned int len = StringIn.length();
    it1 = StringIn.end();
    if (len % 3 == 0)
        for (int i = 1; i < len / 3; i++)
        {
            it2 = it1 - 3 * i;
            StringIn.insert(it2, ',');
        }
    else
        for (int i = 1; i <= len / 3; i++)
        {
            it2 = it1 - 3 * i;
            StringIn.insert(it2, ',');
        }
    cout << StringIn << endl;
    system("pause");
    return 0;
}  

Как вы видите на следующих фотографиях, код отлично работает для числа с

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 цифр
enter image description here

16, 17, 18, 19, 20, 21, 22, 23, 24 цифр

enter image description here

32, 33, 34, 35, 36 цифр

enter image description here

Но это вызывает точку останова для определенного количества цифр. Это определенное количество цифр: 13, 14, 15, 25, 26, 27, 28, 29, 30, 31

.

Здесь я отследил код для 13 цифр.
enter image description here
enter image description here
enter image description here
enter image description here
enter image description here
enter image description here

Ответы [ 2 ]

2 голосов
/ 10 июня 2019

Причины, по которым это не работает для вас, - в комментариях к вашему сообщению.Для ответа следующий код должен выполнить работу за вас:

string str;
string::iterator it;
cout << "Enter a number with any number of digits: ";
cin >> str;
if (str.size() > 3) {
    it = str.end() - 3; // Take the first place where there should be a comma
    while (it > StringIn.begin()) { // Make sure that you are still in a string's place
        if (it - str.begin() > 3)
            it = str.insert(it, ',') - 3; // Insert a comma in the right place, and move to the next comma place
        else it = str.begin();
    }
}
cout << str << endl;
1 голос
/ 10 июня 2019

Я решил проблему следующим образом:

#include <iostream>
#include <string>

using namespace std;


int main()
{
    string StringIn;
    cout << "Enter a number with any number of digits: ";
    cin >> StringIn;
    unsigned int len = StringIn.length();
    if (len % 3 == 0)
        for (int i = 1; i < len / 3; i++)
            StringIn.insert(StringIn.end() - (4 * i - 1), ',');
    else
        for (int i = 1; i <= len / 3; i++)
            StringIn.insert(StringIn.end() - (4 * i - 1), ',');
    cout << StringIn << endl;
    system("pause");
    return 0;
}

В предыдущей версии кода , it1, который указывал на конец строки, не обновлялся, в то время как StringIn и it2 обновлялись. Поэтому я написал строку

it1 = StringIn.end();  

внутри цикла по

StringIn.insert(StringIn.end() - (4 * i - 1), ',');  

но поскольку строка модифицирована, в каждой итерации должно быть небольшое изменение в выражении.
Рассмотрим:

1234567890123456789012  

когда i=1, символ ',' должен быть вставлен в end-3

1234567890123456789,012  

когда i=2, символ ',' должен быть вставлен в end-7, а не в end-6, потому что ',' был вставлен в предыдущей итерации

1234567890123456,789,012  

когда i=3, символ ',' должен быть вставлен в end-11, а не в end-9, потому что два ',' были вставлены в предыдущей итерации.

Таким образом, в i -й итерации (i-1) чисел ',' было вставлено из предыдущих итераций. Чтобы вставить ',' в нужном месте, мы должны вернуться 3 * i + (i - 1) шагов от конца.

Вот почему я написал строки 19 и 22 как эту форму

enter image description here

...