【问题标题】:How to use string.substr() function?如何使用 string.substr() 函数?
【发布时间】:2021-12-02 05:55:13
【问题描述】:

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

【问题讨论】:

标签: c++ string substring


【解决方案1】:

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

b = a.substr(i,2);

?

【讨论】:

  • 是的,他每次都在增加子字符串的长度。
【解决方案2】:

如图heresubstr的第二个参数是长度,不是结束位置:

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

生成子串

返回一个字符串对象,其内容初始化为当前对象的子字符串。该子字符串是从字符位置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 这样的数字,您的输出看起来会很有趣。由于您在字符串部分使用 atoi() 并输出该整数,因此您会得到 12 20 4 45。您可能想尝试只输出字符串本身,是两个字符长:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        您可以在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;
        }
        

        【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          使用 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;
          }
          

          【讨论】:

            【解决方案8】:

            字符串构造函数可用于获取子字符串的副本。

            string(const string& str, size_t pos, size_t n) 
            

            例如...

            b = string(a, i, 2); // substring of a from position i, including 2 characters
            

            这与substr 的不同之处在于不能省略长度n。我提供这个只是作为一种选择,而不是作为一种改进。

            【讨论】:

              猜你喜欢
              • 2020-12-07
              • 1970-01-01
              • 2014-03-30
              • 1970-01-01
              • 1970-01-01
              • 2018-03-21
              • 2011-08-21
              • 1970-01-01
              相关资源
              最近更新 更多