簡體   English   中英

在C ++中從頭到尾將字符串分成兩個一組

[英]Splitting up a string from end to start into groups of two in C++

我很好奇我制作程序的方式,該程序接受一個字符串,然后檢測它的結尾,然后開始將它“從結尾到開頭”分成兩部分? 例如,用戶輸入mskkllkkk ,並且輸出必須為m sk kl lk kk

我嘗試在網上搜索所需的工具,並熟悉了迭代器,並嘗試將其用於此目的。 我做了這樣的事情:

#include "iostream"
#include "string"
#include "conio.h"

int main() {
    int k=0,i=-1;
    std::string str1;
    std::string::iterator PlaceCounter;
    std::cin >> str1;
    PlaceCounter = str1.end();
    for (PlaceCounter; PlaceCounter != str1.begin(); --PlaceCounter)
    {
        ++k;
        if (k % 2 == 0 && k-1 != 0) {
            ++i;
            str1.insert(str1.end()-k-i,' ');
        }
    }
    std::cout << str1;
    _getch();
return 0;
}

起初,當我輸入幾個任意情況時,它似乎工作得很好(可以將計算器中的所有三個數字從頭到尾全部放入一組,從而使數字更易讀,這樣的事情可以准確地用在計算器中),但是突然我輸入以下內容: jsfksdjfksdjfkdsjfskjdfkjsfn ,我得到了錯誤消息:“ 字符串迭代器不可減少 ”。

大概我需要為C ++學習更多的書,以便自己解決這個問題,但是現在我還是一個初學者,對此非常好奇。 為什么顯示該錯誤信息? 提前致謝。

當您在字符串中insert() ,對其的迭代器可能會失效。 特別是在所有情況下,插入點之后的所有迭代器在所有情況下均應視為無效,但如果std::string需要獲得更多內存,則所有迭代器也會無效:內部緩沖區將被更大的緩沖區替換,從而導致所有現有的迭代器(以及引用和指針)指向要無效的字符串元素。

解決該問題的最簡單方法是,通過reserve()提前分配足夠的空間來確保該字符串不需要分配更多的內存。 由於您每兩個字符添加一個空格,因此請確保有足夠的空間來str1.size() + str1.size() / 2u字符:

str1.reserve(str1.size() + str1.size() / 2u);
for (auto PlaceCounter = str1.end(); PlaceCounter != str1.begin(); --PlaceCounter) {
    // ...
}

請注意,您的算法效率很低:它是O(n 2 )。 該操作可以用O(n)復雜度來完成。 您將從一開始就將字符串的大小調整為適當的大小,在尾部填充一些默認字符,然后將內容從末尾直接復制到適當的位置。

str1.insert(str1.end()-k-i,' ');

這將修改循環迭代的字符串。 具體來說,這會在字符串中插入一些內容。

使用std::string ,非常類似於std::vector ,將其插入字符串將(可能)使所有指向該字符串的現有迭代器無效。 所顯示的代碼執行的第一次插入會導致未定義的行為,隨后將引用現有的,現已失效的迭代器。

您將需要用字符串中的索引替換迭代器,或者代替修改現有字符串以構造新字符串,而保持原始字符串不變。

這是一種可能的C ++方法。 從我的工具包中,這是我如何將逗號插入十進制字符串(即s應該包含數字):

輸入:“ 123456789”

// insert comma's from right (at implied decimal point) to left
std::string digiCommaL(std::string s)
{
   // Note: decrementing a uint (such as size_t) will loop-around, 
   //       and not underflow.  Be sure to use int ...

   int32_t sSize = static_cast<int32_t>(s.size()); // change to int
   //      ^^^^^-----------_____
   if (sSize > 3)          vvvvv
      for (int32_t indx = (sSize - 3); indx > 0; indx -= 3)
         s.insert(static_cast<size_t>(indx), 1, ',');

   return(s);
} 

返回:“ 123,456,789”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM