文字列形式でいくつかの数値を読み取り、次のように出力するプログラムを作成します。数値が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;
}
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;
}
_
別の興味深いバリアントの質問は次のとおりです。
どうやって"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 << " ";
}
substr(i,j)
は、インデックスi
(最初のインデックスを0と仮定)から開始し、次のj
文字を取得することを意味します。インデックスj
に上がることを意味しません。
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++;
}
}
}
上記の出力は、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;
}
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;
}