使用指针从char array []中删除/删除字符

时间:2016-08-08 01:04:10

标签: c++ arrays pointers visual-c++ char

我需要帮助从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;
        }

2 个答案:

答案 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相同的缓冲区,即带字符串的缓冲区。如果字符串以字母字符开头,那么唯一会发生的事情就是每个字符都会被复制到自身之上,pq一起前进。只要p看到非字母字符,它就会继续前进,但q会“留下”,并且会继续累积任何剩余的字母字符。当一切都完成后,'\ 0'将被写入q,终止新的仅大写字符串。

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