【问题标题】:How to remove leading zeros from string using C++?如何使用 C++ 从字符串中删除前导零?
【发布时间】:2014-09-08 14:25:22
【问题描述】:

我想从 "0000000057" 这样的字符串中删除前导零。

我这样做了,但没有得到任何结果:

string AccProcPeriNum = strCustData.substr(pos, 13);

string p48Z03 = AccProcPeriNum.substr(3, 10);

我只想输出 57。

任何关于 C++ 的想法?

【问题讨论】:

  • 您的意思是要删除前导零吗?
  • 顺便说一下,您想删除 前导零。
  • @cdhowie 是的.....我的值现在是 57,它可能在 3 位或 4 位之后我想从这 10 个字符字符串中删除前导零
  • 为什么?如果您想要该值,只需将其转换为整数,例如aoti()。如果您想将其保留为字符串,则肯定有问题,因为前导零并非偶然到达那里。它们肯定是固定大小字段的定义格式的一部分吗?

标签: c++ string


【解决方案1】:
#include <string>    

std::string str = "0000000057";
str.erase(0, str.find_first_not_of('0'));

assert(str == "57");

LIVE DEMO

【讨论】:

  • 如果 str = "0",它不应该做任何事情,但是你的代码使它成为一个空字符串
【解决方案2】:

Piotr S's answer 很好,但有一种情况会返回错误答案,即全零情况:

000000000000

要考虑这一点,请使用:

str.erase(0, min(str.find_first_not_of('0'), str.size()-1));

即使str.size() 是0,它也可以工作。

【讨论】:

    【解决方案3】:

    虽然它可能不是最有效的(就运行时速度而言)做事的方式,但我很想这样做:

    std::cout << std::stoi(strCustData);
    

    这使用起来简单直接,当输入完全由0s 组成时,它会给出合理的输出(单个“0”)。只有当分析表明这个简单的解决方案是一个问题时,我才会考虑编写更复杂的代码以希望提高速度(我怀疑会出现这种情况)。

    这里明显的限制是,这确实假设前导零之后的字符是数字。这在您的样本中显然是正确的,但我想您可以想象您有不正确的数据。

    【讨论】:

    • 这还假设生成的数字足够小以适合int。
    • 为什么不使用 std::stoi64,它适用于 32 (int) 和 64 (unsigned int - 不是 64 但达到了 32 的限制)
    【解决方案4】:

    这应该作为一个通用函数,可以应用于任何std::basic_string 类型(包括std::string):

    template <typename T_STR, typename T_CHAR>
    T_STR remove_leading(T_STR const & str, T_CHAR c)
    {
        auto end = str.end();
    
        for (auto i = str.begin(); i != end; ++i) {
            if (*i != c) {
                return T_STR(i, end);
            }
        }
    
        // All characters were leading or the string is empty.
        return T_STR();
    }
    

    在你的情况下,你会这样使用它:

    string x = "0000000057";
    string trimmed = remove_leading(x, '0');
    
    // trimmed is now "57"
    

    (See a demo.)

    【讨论】:

      【解决方案5】:
      #include<algorithm>
      #include<iostream>
      #include<string>
      using namespace std;
      
      
      int main()
      {
         string s="00000001";
         cout<<s<<endl;
         int a=stoi(s);
         cout<<a;
         //1 is ur ans zeros are removed
      
      
      }
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
      【解决方案6】:

      这个 C 语言友好的代码删除了前导零,只要 char 数组的长度适合 int,就可以使用:

      char charArray[6] = "000342";
      int inputLen = 6;
      
      void stripLeadingZeros() {
          int firstNonZeroDigitAt=0, inputLen = strlen(charArray);
      
          //find location of first non-zero digit, if any
          while(charArray[firstNonZeroDigitAt] == '0')
              firstNonZeroDigitAt++;
      
          //string has no leading zeros
          if(firstNonZeroDigitAt==0)
              return; 
      
          // string is all zeros
          if(firstNonZeroDigitAt==inputLen) {
              memset(charArray, 0, sizeof charArray);
              strcpy(charArray, "0");
              inputLen = 1;
              return;
          }
      
          //shift the non-zero characters down
          for(int j=0; j<inputLen-firstNonZeroDigitAt; j++) {
              charArray[j] = charArray[firstNonZeroDigitAt+j];
          }
      
          //clear the occupied area and update string length
          memset(charArray+inputLen-firstNonZeroDigitAt, 0, inputLen-firstNonZeroDigitAt+1);
          inputLen -= firstNonZeroDigitAt;
      }
      

      【讨论】:

        猜你喜欢
        • 2011-04-09
        • 1970-01-01
        • 2014-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-20
        • 2011-07-03
        相关资源
        最近更新 更多