首页 > 解决方案 > 循环从字符数组中删除过多的空格(C++)

问题描述

我正在尝试创建一个简单的循环来读取字符数组并打印回数组而没有任何过多的空白。

我的循环有问题,希望能得到一些帮助。

for(int i=0;i<ARR_SIZE;++i) //Initialize loop
{
if(isspace(arr[i])&&isspace(arr[i+1]) //If check for double whitespace
   {arr[i+1] = arr[i+2];} //If detected, move the character after the whitespace (+2) to (+1)
 }

这确实删除了双空格,但我在复制所有其他字符时遇到了逻辑问题。

即当前,如果我输入“t_est”,我会得到“t_eest”。

这是一个相当简单的问题,但我想我要么想太多,要么错过了一些简单的逻辑步骤。

任何意见,将不胜感激。

标签: c++

解决方案


简而言之,您不仅应该移动下一个字符来替换重复的空格,还应该在之后移动所有字符。

最简单的方法当然是定义另一个数组,如另一个答案中所述。

但是,由于您只是删除字符,因此可以轻松地就地完成:

只需保留两个指针,一个用于读取字符,一个用于写入位置。“读取”指针将从字符串开始迭代到结束

在伪代码中,并假设您正在处理 C 样式字符串(即以空字符结尾的字符数组):

char* src = inputString;
char* dest = src;
while src != NULL {
    if *src is not space OR previous char is not space { 
        write to dest pos, and increment dest
    }
    increment src
}
*dest = NULL;  // null-terminating at new position

以较短的形式(我尽量不牺牲可读性太多):

char* src = dest = inputString;
for ( ; *src; ++src) {
    if (src == inputString || ! isspace(*src) || *src != *(src-1)) {
        *(dest++) = *src;
    }
}
*dest = '\0';

推荐阅读