我在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
。
答案 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;
}
}
}
}
}
}