【问题标题】:Selecting only the first few characters in a string C++仅选择字符串 C++ 中的前几个字符
【发布时间】:2016-03-09 21:35:53
【问题描述】:

我想使用 C++ 选择字符串的前 8 个字符。现在我创建了一个 8 个字符长的临时字符串,并用另一个字符串的前 8 个字符填充它。

但是,如果另一个字符串不是 8 个字符长,则会留下不需要的空格。

string message = "        ";

const char * word = holder.c_str();

for(int i = 0; i<message.length(); i++)
    message[i] = word[i];

如果word"123456789abc",则此代码可以正常工作并且message 包含"12345678"

但是,如果word 更短,例如"1234",则消息最终为"1234 "

如何选择字符串的前八个字符,或者如果字符串短于 8 个字符,则选择整个字符串?

【问题讨论】:

    标签: c++ string c-strings


    【解决方案1】:

    只需使用std::string::substr:

    std::string str = "123456789abc";
    std::string first_eight = str.substr(0, 8);
    

    【讨论】:

    • 他的问题模棱两可,我们无法判断哪个答案是正确的。这取决于“从字符串中删除其余字符”中“字符串”的OP的含义。
    • 如果第一个字符串少于 8 个字符,对它执行 substr 会改变字符串的任何内容吗?但是感谢您的快速回答,它运行良好。
    • @qlear 您应该阅读文档 - substr() 是一个 const 方法,即在任何情况下都不会更改对象本身。
    • @qlear 将引发std::out_of_range 异常。正如 Slava 所说,std::string::substr 不会修改它被调用的字符串;它将返回一个新字符串。有关在没有任何间接的情况下修改字符串本身的方法,请参阅 DavidSchwartz 的回答。
    【解决方案2】:

    只需在字符串上调用resize

    【讨论】:

      【解决方案3】:

      如果我没有理解错,那就写吧

      std::string message = holder.substr( 0, 8 );
      

      如果你需要从字符数组中抓取字符然后你可以写例如

      const char *s = "Some string";
      
      std::string message( s, std::min<size_t>( 8, std::strlen( s ) );
      

      【讨论】:

        【解决方案4】:

        或者你可以使用这个:

        #include <climits>
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        

        如果最大值为 8,它将停在那里。但是你必须设置

        const char * word = holder.c_str();
        

        到 8。我相信你可以通过写作来做到这一点

         const int SIZE = 9;
         char * word = holder.c_str();
        

        让我知道这是否有效。

        如果他们在任何时候点击空格,它只会读取到空格。

        【讨论】:

          【解决方案5】:
          char* messageBefore = "12345678asdfg"
          int length = strlen(messageBefore);
          char* messageAfter = new char[length];
          
          for(int index = 0; index < length; index++)
          {
              char beforeLetter = messageBefore[index];
              // 48 is the char code for 0 and 
              if(beforeLetter >= 48 && beforeLetter <= 57)
              {
                  messageAfter[index] = beforeLetter;
              }
              else
              {
                  messageAfter[index] = ' ';
              }
          }
          

          这将创建一个适当大小的字符数组并传输每个数字字符 (0-9) 并用空格替换非数字。这听起来像您正在寻找的东西。

          鉴于其他人根据您的问题所做的解释,您可以轻松修改上述方法,为您提供仅包含数字部分的结果字符串。

          类似:

          int length = strlen(messageBefore);
          int numericLength = 0;
          while(numericLength < length &&
                messageBefore[numericLength] >= 48 &&
                messageBefore[numericLength] <= 57)
          {
              numericLength++;
          }
          

          然后在前面的逻辑中使用numericLength 代替length,你会得到第一串数字字符。

          希望这会有所帮助!

          【讨论】:

            猜你喜欢
            • 2020-07-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-01-02
            相关资源
            最近更新 更多