2016-08-08 145 views
1

我需要帮助从字符数组中删除空格和特殊字符。我一直遇到的问题是,擦除函数只适用于字符串数据类型,如果我没有弄错。该分配要求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; 
     } 

回答

3
char* tail = std::remove_if(str, str + strlength, 
    [](char c){ return !isalpha(c)||(!isalnum(c)); }); 
strlength = tail - str; 
*tail = 0; 
+0

我其实喜欢在这里使用lambda。 +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,字符串为缓冲区。如果字符串以字母字符开头,则唯一会发生的情况是每个字符都被复制到顶部,pq一起前进。只要p看到一个非字母字符,它会继续前进,但q“被留下”,并且将继续累积任何剩余的字母字符。当一切完成时,'\ 0'被写入q,终止新的大写字母字符串。

这个唯一真正困难的部分是理解为什么一切都必须完全按顺序发生;即在p增加之前必须复制字母字符,等等......如果你不明白为什么,你的橡皮鸭会向你解释它。