如何使用 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);
这使用起来简单直接,当输入完全由0
s 组成时,它会给出合理的输出(单个“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++ 从字符串中删除前导零?的主要内容,如果未能解决你的问题,请参考以下文章