web-dev-qa-db-ja.com

string.substr()関数の使用方法は?

文字列形式でいくつかの数値を読み取り、次のように出力するプログラムを作成します。数値が12345の場合、12 23 34 45を出力します。 c ++文字列ライブラリのsubstr()関数を使用してみましたが、奇妙な結果が得られました-期待される結果ではなく1 23 345 45を出力します。どうして ?

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int main(void)
{
    string a;
    cin >> a;
    string b;
    int c;

    for(int i=0;i<a.size()-1;++i)
    {
        b = a.substr(i,i+1);
        c = atoi(b.c_str());
        cout << c << " ";
    }
    cout << endl;
    return 0;
}
36
VaioIsBorn

私が正しい場合、 substr() の2番目のパラメーターはサブストリングの長さでなければなりません。どう?

b = a.substr(i,2);

65
Ghislain Fourny

here に示すように、substrの2番目の引数は終了位置ではなく、lengthです。

string substr ( size_t pos = 0, size_t n = npos ) const;

部分文字列の生成

内容が現在のオブジェクトの部分文字列に初期化された文字列オブジェクトを返します。このサブストリングは、文字位置posから始まり、n文字の長さを持つ文字シーケンスです。

b = a.substr(i,i+1);は、iの値に対して生成されます:

_substr(0,1) = 1
substr(1,2) = 23
substr(2,3) = 345
substr(3,4) = 45  (since your string stops there).
_

必要なのはb = a.substr(i,2);です

12045のような数値では出力がおかしく見えることにも注意する必要があります。文字列セクションでatoi()を使用してその整数を出力しているため、_12 20 4 45_を取得します。 。 2文字の文字列そのものを出力してみてください。

_b = a.substr(i,2);
cout << b << " ";
_

実際、全体を次のように簡単に書くことができます。

_#include <iostream>
#include <string>
using namespace std;
int main(void) {
    string a;
    cin >> a;
    for (int i = 0; i < a.size() - 1; i++)
        cout << a.substr(i,2) << " ";
    cout << endl;
    return 0;
}
_
21
paxdiablo

別の興味深いバリアントの質問は次のとおりです。

どうやって"12345" as "12 23 34 45"別の文字列を使用せずに?

フォローはしますか?

    for(int i=0; i < a.size()-1; ++i)
    {
        //b = a.substr(i, 2);
        c = atoi((a.substr(i, 2)).c_str());
        cout << c << " ";
    }
3
Rajendra Uppal

substr(i,j)は、インデックスi(最初のインデックスを0と仮定)から開始し、次のj文字を取得することを意味します。インデックスjに上がることを意味しません。

2
user1611542

substr()を使用しないで可能な解決策

#include<iostream>
#include<string>

using namespace std;


int main() {
    string c="12345";
    int p=0;

    for(int i=0;i<c.length();i++) {
        cout<<c[i];
        p++;

        if (p % 2 == 0 && i != c.length()-1) {
            cout<<" "<<c[i];
            p++;
        }
    }
}
2
lionelmessi

上記の出力は、cの次のコードを使用して取得できます。

#include<stdio.h>
#include<conio.h>
#include<string.h>
int main()
{
  char *str;
  clrscr();
  printf("\n Enter the string");
  gets(str);
  for(int i=0;i<strlen(str)-1;i++)
  {
    for(int j=i;j<=i+1;j++)
      printf("%c",str[j]);
    printf("\t");
  }
  getch();
  return 0;
}
2
Shrihari Jadhav

string_viewで可能な解決策

void do_it_with_string_view( void )
{
    std::string a { "12345" };
    for ( std::string_view v { a }; v.size() - 1; v.remove_prefix( 1 ) )
        std::cout << v.substr( 0, 2 ) << " ";
    std::cout << std::endl;
}
0
antb52