使用指针从 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
相同的缓冲区,即带有字符串的缓冲区。如果字符串以字母字符开头,唯一会发生的事情是每个字符都被复制到自身之上,p
和q
一起前进。只要p
看到一个非字母字符,它就会继续前进,但q
是“落后”的,并且将继续仅累积任何剩余的字母字符。当一切都完成后,'\0' 被写入q
,终止新的大写字符串。
唯一真正困难的部分是理解为什么一切都必须完全按顺序发生;即必须在p
递增之前复制字母字符,等等...Talk to your rubber duck,如果您不明白为什么,您的橡皮鸭会向您解释。
【讨论】:
以上是关于使用指针从 char array[] 中删除/删除字符的主要内容,如果未能解决你的问题,请参考以下文章