如何使用string.substr()函数?

Vai*_*orn 39 c++ string substring

我想制作一个程序,以字符串格式读取一些数字并输出如下:如果数字是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;
}
Run Code Online (Sandbox Code Playgroud)

Ghi*_*rny 67

如果我是正确的,第二个参数substr()应该是子串的长度.怎么样

b = a.substr(i,2);
Run Code Online (Sandbox Code Playgroud)

  • 是的,他每次都会增加子字符串的长度。 (2认同)

pax*_*blo 22

如所示在这里,第二个参数substr长度,而不是结束位置:

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).
Run Code Online (Sandbox Code Playgroud)

你需要的是什么 b = a.substr(i,2);

您还应该知道,对于像12045这样的数字,您的输出看起来很有趣.12 20 4 45由于您正在使用atoi()字符串部分并输出该整数,因此您将得到.你可能会想尝试只是outputing字符串本身,这是两个字符:

b = a.substr(i,2);
cout << b << " ";
Run Code Online (Sandbox Code Playgroud)

事实上,整个事情可以更简单地写成:

#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;
}
Run Code Online (Sandbox Code Playgroud)