我需要帮助从char数组中删除空格和特殊字符。我一直遇到的问题是擦除函数仅适用于字符串数据类型,如果我没有弄错的话。赋值调用char数组而不是字符串,所以我不能只转换它或有一个字符串变量。我已经尝试过查找它,但是所有类似的建议只是将它转换为字符串或以字符串开头,这是我做不到的。我是编程和指针的新手对我来说有点奇怪,所以如果答案很明显,我很抱歉。感谢所有有帮助的人。
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <ctype.h>
using namespace std;
int main()
{
const int SIZE = 80;
char str[SIZE];
char* strPtr;
int strlength;
int j = 0;
int front = 0, back; int flag = 1;
strPtr = str;
cout << "This program checks for palidromes." << endl;
cout << "Please enter a phrase." << endl;
cout << endl;
cin.getline(str, SIZE);
//Get the length of string str
strlength = strlen(str);
//Convert all the characters in the string str to uppercase
for (int i = 0; i < strlength; i++)
{
if (!isupper(str[i]))
str[i] = toupper(str[i]);
}
//Remove all the special characters except letters a - z
for (int i = 0; i < strlength; i++)
if (!isalpha(str[i])||(!isalnum(str[i])))
{
str.erase(str[i]); // need help here. Not sure how to go about it.
}
//str[j] = '\0';
return 0;
}
答案 0 :(得分:3)
char* tail = std::remove_if(str, str + strlength,
[](char c){ return !isalpha(c)||(!isalnum(c)); });
strlength = tail - str;
*tail = 0;
答案 1 :(得分:2)
另一个答案正确地指向std::remove_if
,但我怀疑你真的想了解如何自己实现删除,而不是将问题转储到C ++库。此外,您自己的尝试将所有剩余的字符转换为大写,而另一个答案不会。
这实际上比你想象的要简单。相关位如下:
char *p=str, *q=str;
while (*p)
{
if (isalpha(*p))
*q++=toupper(*p);
++p;
}
*q='\0';
首先,没有必要计算此字符串的strlen()
。只需迭代从字符串开头到结尾的指针,直到它指向终止'\ 0'即可。
这将是p
指针。 p
从字符串的开头开始,while
循环的每次迭代都会增加它,while
循环停在\0
。
然后,如果p
的字符是字母,则会将其复制到q
指针,将其转换为大写,并推进q
指针。
因此,只有字母字符才会被复制到q
,其他所有内容都会被跳过。
q
开始指向与p
相同的缓冲区,即带字符串的缓冲区。如果字符串以字母字符开头,那么唯一会发生的事情就是每个字符都会被复制到自身之上,p
和q
一起前进。只要p
看到非字母字符,它就会继续前进,但q
会“留下”,并且会继续累积任何剩余的字母字符。当一切都完成后,'\ 0'将被写入q
,终止新的仅大写字符串。
唯一真正困难的部分是理解为什么一切必须完全按顺序发生;即必须在p
递增之前复制字母字符,等等...... Talk to your rubber duck,如果您不明白为什么,您的橡皮鸭会向您解释。