首页 文章

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

提问于
浏览
33

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

7 回答

  • 2

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

    b = a.substr(i,2);
    

  • 21

    here所示, substr 的第二个参数是长度,而不是结束位置:

    string substr(size_t pos = 0,size_t n = npos)const; Generate substring返回一个字符串对象,其内容初始化为当前对象的子字符串 . 该子字符串是从字符位置pos开始并具有n个字符长度的字符序列 .

    对于 i 的值,您的行 b = a.substr(i,i+1); 将生成:

    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这样的数字看起来很有趣 . 你会得到 12 20 4 45 ,因为你在字符串部分使用 atoi() 并输出那个整数 . 您可能想尝试只输出两个字符长的字符串本身:

    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;
    }
    
  • 2

    另一个有趣的变体问题可能是:

    如何在不使用其他字符串的情况下将 "12345" 设为 "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

    您可以使用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;
    }
    
  • 60

    不使用 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++;
            }
        }
    }
    
  • 0

    substr(i,j) 表示从索引 i 开始(假设第一个索引为0)并接下来 j 个字符 . 这并不意味着上升到索引 j .

  • 2

    Possible solution with 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;
    }
    

相关问题