从字符串中删除逗号

时间:2010-04-21 15:55:57

标签: c++ string

我在C ++中创建了一个程序,它从给定的整数中删除逗号(,)。即2,00,00将返回20000。我没有使用任何新的空间。这是我创建的程序:

void removeCommas(string& str1, int len)
{
    int j = 0;

    for (int i = 0; i < len; i++)
    {
        if (str1[i] == ',')
        {
            continue;
        }
        else
        {
            str1[j] = str1[i];
            j++;
        }
    }

    str1[j] = '\0';
}

void main()
{
    string str1;
    getline(cin, str1);
    int i = str1.length();
    removeCommas(str1, i);
    cout << "the new string " << str1 << endl;
}

以下是我得到的结果:

Input : 2,000,00
String length  =8
Output = 200000 0
Length = 8

我的问题是,为什么它在输出中显示长度为8,并在我输入空字符时显示字符串的其余部分。它应显示输出为200000,长度为6

8 个答案:

答案 0 :(得分:16)

让标准库为您完成工作:

#include <algorithm>

str1.erase(std::remove(str1.begin(), str1.end(), ','), str1.end());

如果您不想修改原始字符串,那也很容易:

std::string str2(str1.size(), '0');
str2.erase(std::remove_copy(str1.begin(), str1.end(), str2.begin(), ','), str2.end());

答案 1 :(得分:8)

最后需要调整大小。

与流行的看法相反,std :: string CAN包含包含0的二进制数据。 std :: string的.size()与包含NULL终止的字符串无关。

std::string s("\0\0", 2);
assert(s.size() == 2);

答案 2 :(得分:4)

答案可能是std::string不是NUL终止的。不应将结束+第1个字符设置为'\ 0',而应使用str.resize(new_length);

编辑:还要考虑一下,如果你的源字符串中没有逗号,那么你的'\ 0'将被写入一个字符串末尾(这可能恰好可能正常工作,但是不正确)。< / p>

答案 3 :(得分:1)

std :: string不以\0结尾,你将它与C中的char *混合使用。所以你应该使用resize

答案 4 :(得分:1)

解决方案已由Fred L发布。

以“程序方式”(没有“算法”) 你的程序看起来像:

void removeStuff(string& str, char character)
{
 size_t pos;
 while( (pos=str.find(character)) != string::npos )
      str.erase(pos, 1);
}

 void main()
{
 string str1;
 getline(cin, str1);
 removeStuff(str1, ',');
 cout<<"the new string "<<str1<<endl;
}

然后

此致

RBO

编辑/附录:

为了解决读者的一些效率问题, 我试图找到最快的解决方案。 当然,这应该会对字符串大小产生影响 大约10 ^ 5个字符,其中一些字符有待删除 包括:

 void fastRemoveStuff(string& str, char character)
{
 size_t len = str.length();
 char *t, *buffer = new char[len];
 const char *p, *q;

 t = buffer, p = q = str.data();
 while( p=(const char*)memchr(q, character, len-(p-q)) ) {
     memcpy(t, q, p-q);
     t += p-q, q = p+1;
 }
 if( q-str.data() != len ) {
     size_t tail = len - (q-str.data());
     memcpy(t, q, tail);
     t += tail;
 }
 str.assign(buffer, t-buffer);
 delete [] buffer;
}

 void main()
{
 string str1 = "56,4,44,55,5,55"; // should be large, 10^6 is good
 // getline(cin, str1);
 cout<<"the old string " << str1 << endl;
 fastRemoveStuff(str1, ',');
 cout<<"the new string " << str1 << endl;
}

答案 5 :(得分:0)

我自己的程序版本:

#include <string>
#include <cassert>

using namespace std;

string Remove( const string & s, char c  ) {

    string r;
    r.reserve( s.size() );

    for ( unsigned int i = 0; i < s.size(); i++ ) {
        if ( s[i] != c ) {
            r += s[i];
        }
    }

    return r;
}

int main() {
    assert( Remove( "Foo,Bar,Zod", ',' ) == "FooBarZod" );
}

答案 6 :(得分:0)

以下是该计划:

void main()
{
  int  i ;
  char  n[20] ;

  clrscr() ;

  printf("Enter a number. ") ;
  gets(n) ;

  printf("Number without comma is:") ;
  for(i=0 ; n[i]!='\0' ; i++)
    if(n[i] != ',')
      putchar(n[i]) ;

  getch();
}

有关详细说明,请参阅此博客:http://tutorialsschool.com/c-programming/c-programs/remove-comma-from-string.php

这篇文章中讨论了同样的问题:How to remove commas from a string in C

答案 7 :(得分:0)

好吧,如果你计划用c ++读取文件。我发现了一种方法,虽然我认为这不是最好的方法,但是在我之前来到这些论坛寻求帮助之后,我认为是时候用我的努力做出贡献了。

看,这就是问题,我要向你呈现的是我现在正在构建的地图编辑器的源代码的一部分,该地图编辑器显然有为2D RPG游戏创建地图的目的,与经典的口袋妖怪游戏相同的风格。但是这段代码更倾向于开发世界地图编辑器。

`int strStartPos = 0;     int strSize = 0;     int arrayPointInfoDepth = 0;

for (int x = 0; x < (m_wMapWidth / (TileSize / 2)); x++) {
    for (int y = 0; y < (m_wMapHeight / (TileSize / 2)); y++) {
        if (ss >> str) {


            for (int strIterator = 0; strIterator < str.length(); strIterator++) {
                if (str[strIterator] == ',') {`

                    Here we need to define the size of the string we want to extract after the previous comma and before the next comma

                    `strSize = strIterator - strStartPos;`

在这里,我们进行实际的转换,我们将矢量作为一个3D矢量,然后是我们想要在那一刻提取的字符串

                    `m_wMapPointInfo[x][y][arrayPointInfoDepth] = str.substr(strStartPos, strSize);`

在这里,我们只定义我们想要提取的下一小段字符串的起始位置,所以+1表示在逗号之后我们刚刚通过                         strStartPos = strIterator + 1;

在这里,由于我的向量只有6个由WorldMapPointInfos定义的位置,我们需要增加数组的第三个维度,最后做一个检查点,如果信息已经到达数字6然后打破循环

                    arrayPointInfoDepth++;

                    if (arrayPointInfoDepth == WorldMapPointInfos) {
                        strStartPos = 0;
                        arrayPointInfoDepth = 0;
                        break;
                    }
                }
            }
        }



    }
}

无论是哪种方式,我都认为向量只是一个字符串,这就是你需要知道的所有内容,希望这有助于:/

完整视图:

int strStartPos = 0;
int strSize = 0;
int arrayPointInfoDepth = 0;

for (int x = 0; x < (m_wMapWidth / (TileSize / 2)); x++) {
    for (int y = 0; y < (m_wMapHeight / (TileSize / 2)); y++) {
        if (ss >> str) {


            for (int strIterator = 0; strIterator < str.length(); strIterator++) {
                if (str[strIterator] == ',') {
                    strSize = strIterator - strStartPos;

                    m_wMapPointInfo[x][y][arrayPointInfoDepth] = str.substr(strStartPos, strSize);

                    strStartPos = strIterator + 1;

                    arrayPointInfoDepth++;

                    if (arrayPointInfoDepth == WorldMapPointInfos) {
                        strStartPos = 0;
                        arrayPointInfoDepth = 0;
                        break;
                    }
                }
            }
        }



    }
}