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

Posted

技术标签:

【中文标题】使用指针从 char array[] 中删除/删除字符【英文标题】:removing/deleting characters from char array[] using pointers 【发布时间】:2016-08-08 01:04:09 【问题描述】:

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

【问题讨论】:

【参考方案1】:
char* tail = std::remove_if(str, str + strlength,
    [](char c) return !isalpha(c)||(!isalnum(c)); );
strlength = tail - str;
*tail = 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 递增之前复制字母字符,等等...Talk to your rubber duck,如果您不明白为什么,您的橡皮鸭会向您解释。

【讨论】:

以上是关于使用指针从 char array[] 中删除/删除字符的主要内容,如果未能解决你的问题,请参考以下文章

从字符串指针数组中删除一个元素

从 Parse Array 中删除项目后 UITableView 崩溃

C++中的指针和删除

如何从 char 数组中清除单个字符?

[两个指针]删除字符串中指定的字符

如何在 C++ 中删除 char* [重复]