我正在尝试从字符串中删除所有G。我需要使用指针,但我的问题是我不知道用什么来替换找到的G。我不知道一个空字符常量('')不会编译。如何删除符合此代码的字符?
void deleteG(char cString[])
{
char *ptr;
ptr = cString;
while (*ptr != '\0')
{
if (*ptr == 'g' || *ptr == 'G')
{
*ptr = ' ';
}
ptr++;
}
}
答案 0 :(得分:1)
正如@Captain Obvlious指出的那样,你的while
循环永远不会结束,因为除非一封信是' g'或者' G'它永远不会增加指针。如果您在要评估的字母上放置断点,甚至使用std::cout
,这很容易确定。
解决方案当然是将while
循环更改为以下内容:
while (*ptr != '\0')
{
if (*ptr == 'g' || *ptr == 'G')
{
*ptr = *(ptr+1);
}
ptr++;
}
虽然这解决了无限循环的问题,但更好的解决方案是使用标准库:std::string
!因为我不能100%确定你要完成的任务,我将提供两个例子:
如果您的目标是删除所有大写字符,请考虑使用标准库:
bool IsUpper(char c)
{
return !!std::isupper(c);
}
int main()
{
std::string test = "Hello World :D";
test.erase(std::remove_if(test.begin(), test.end(), IsUpper), test.end());
return 0;
}
这使用std::string::erase
和std::remove_if
删除字符串中的所有大写字母。 std::remove_if
采用开始和结束iterator
(我们给它开始和结束我们的test
字符串)和一个谓词(我们的函数IsUpper
)将为每个调用容器中的元素(在这种情况下,char
中的每个std::string
0)。如果谓词(IsUpper
)为true
返回char
,则char
将移至容器的后面。 std::remove_if
将继续执行此操作,直到结束,然后它会将iterator
返回到有问题的字符的开头(现在位于字符串的末尾)。
然后iterator
使用std::string::erase
,它采用开始和结束iterator
(类似于std::remove_if
)并删除该范围内的元素(在本例中为开头)字符串末尾的违规字符。)
你只剩下" ello orld:"
另请注意,我们的谓词IsUpper
使用另一个标准库函数std::isupper
来确定char
是否为大写。
如果您的函数名称deleteG
建议您尝试从字符串中删除 g 的所有实例,请考虑:
bool IsG(char c)
{
return c == 'g' || c == 'G';
}
int main()
{
std::string test = "GHelgglo gWorlgGd";
test.erase(std::remove_if(test.begin(), test.end(), IsG), test.end());
return 0;
}
与上面类似,但是我们已经将谓词(和test
字符串)替换为一个函数,该函数告诉我们某个字符是否是 g :恰当地命名为{{ 1}}。
您将离开" Hello World"
答案 1 :(得分:1)
我推荐这样的东西......
void deleteAlpha(char cString[])
{
const char *from = cString;
char* to = cString;
do
{
while (isalpha(*from))
++from;
}
while (*to++ = *from++);
}
请注意from
遍历字符串,跳过字母字符,而to
跟踪下一个非字母字符应“压缩”到的位置。 while
循环条件会仔细复制终止NUL
,即使它评估false
并完成迭代。
答案 2 :(得分:0)
char* remove(char *s) {
char *current = s;
char *r = s; //
do {
if ((*current < 'A') || (*current > 'Z') || (*current < 'a') || (*current > 'z')) {
*r++ = *current;
}
} while (*current++ != 0);
return s;
}
答案 3 :(得分:0)
我对c ++并不熟悉。尝试将指针递增到if语句之外,而不是在其中。然后它不会进入无限循环