如何使用C++从字符串中删除前导零?

15

我想从字符串中删除前导零,例如"0000000057"

我尝试了以下方法但没有得到任何结果:

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

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

我希望输出只有57

C++中有任何想法吗?


1
你的意思是要删除前导零吗? - cdhowie
1
顺便提一下,您想要删除前导零。 - paxdiablo
@cdhowie 是的.....我的值现在是57,可能是3位数或4位数,我想从这个10个字符的字符串中删除前导零。 - samio peter
为什么?如果你想要这个值,只需将其转换为整数,例如使用 aoti()。如果你想保留它作为字符串,那肯定有问题,因为前导零不是偶然出现的。它们肯定是固定大小字段定义格式的一部分。 - user207421
6个回答

37
#include <string>    

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

assert(str == "57");

在线演示


3
如果字符串为“0”,它不应该做任何事情,但您的代码会将其变为空字符串。 - sumanth232
@sumanth232 这个答案在问题给出的情况下是正确的。一个字符串 "0000000" 有所有前导零,所以应该返回一个空字符串,问题并没有要求返回包含有效数字的字符串。 - Antonio

37

Piotr S的答案很好,但有一种情况它会返回错误的答案,那就是全部为零的情况:

000000000000

要考虑这个,请使用:

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

即使 str.size()0,它仍然能够工作。


如果问题是“从字符串中删除所有前导零”,对于全零字符串返回空字符串并不是错误答案。此外,这个答案也恰好适用于空字符串,但是str.size()-1通常是一种非常危险的操作,需要进行保护。 - Antonio

2

这应该是一个通用函数,可以应用于任何 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"

(查看演示.)


2

虽然这可能不是最高效的方法(从运行时间速度方面来看),但我会倾向于做类似以下的事情:

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

这个方法简单易用,输入全部为0时会得到一个合理的输出(一个单独的“0”)。只有在性能分析显示这个简单的解决方案存在问题时,我才会考虑编写更加复杂的代码以期提高速度(但我怀疑这种情况不会出现)。
显然,这里的一个限制是假定前导零后面的字符是数字。在你的示例中,这显然是正确的,但我想这种情况也许是可以想象的。

1
这也假设生成的数字足够小,可以适应一个int - Andreas
为什么不使用 std::stoi64 呢?它适用于 32 位(int)和 64 位(unsigned int-不是 64 位但达到了 32 位的极限)。 - 123iamking

0
#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


}

2
虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - Vishal Chhodwani

0

这段C语言友好的代码可以去除前导零,并且只要字符数组的长度适合于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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接