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

Posted

技术标签:

【中文标题】如何使用 C++ 从字符串中删除前导零?【英文标题】:How to remove leading zeros from string using 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()。如果您想将其保留为字符串,则肯定有问题,因为前导零并非偶然到达那里。它们肯定是固定大小字段的定义格式的一部分吗? 【参考方案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;

【讨论】:

以上是关于如何使用 C++ 从字符串中删除前导零?的主要内容,如果未能解决你的问题,请参考以下文章

使用 to_char 函数解析为字符串时,如何从 Oracle 中的日期和月份值中删除前导零?

如何使用 C# 删除前导零

如何从浮点值Swift 3中删除前导零

如何从字母数字文本中删除前导零?

使用 C# 从 IP 地址中删除前导零

如何删除字符串中的前导零和尾随零? Python