Delete/substitute 字符数组中的两个或多个连续字符

Delete/substitute two or more consecutive chars in array of chars

我正在学习 C 并且必须编写一个程序:

到目前为止,我已经完成了以下工作:

#include <stdio.h>
#define DIM 100

int main(int argc, char **argv)
{
    char mainArray [DIM]={'[=11=]'};
    int auxArray [DIM];
    int i, m, n, c, l;

    printf("Enter a string containing two or more consecutive spaces:\n");

/* Read string from stdin */
    do
    {
        mainArray[i]=getchar();
        ++i;
    } while ((mainArray[i-1] != '\n') && (i < DIM-1));

/* Place the string terminator '[=11=]' */
    if (i < DIM)
        mainArray[i]='[=11=]';
    else
        mainArray[DIM-1]='[=11=]';

    l=i;

/* My substitution algorithm */
    for (i=0 ; mainArray[i] != '[=11=]' ; ++i)
    {
        if (mainArray[i] == ' ')
        {
            if (mainArray[i] == mainArray[i+1])
            {
                auxArray[m]=i;
                ++m;
            }
        }
    }

    for (i=0 ; i < m ; ++i)
    {
        for (c=auxArray[i] ; c < l-1 ; ++c)
            mainArray[n]=mainArray[n+1];
    }

/* Display the corrected string */
    for (i=0 ; mainArray[i] != '[=11=]' ; ++i)
        printf("%c", mainArray[i]);

    return 0;
}

例如,输入字符串 "a_long_time_ago___in_a_galaxy__far____,_far_away.." 会产生 "a_long_time_ago_in_a_galaxy_far_,_far_away.."

替换算法我认为一种可能是将多余的空格位置存起来,然后通过辅助数组删除主数组中的空格

我确定我犯了一些业余错误。另外,您认为代码应该如何优化?

提前致谢。

这不是代码审查,但您的代码有几个明显的问题:

mainArray[i]=getchar(); - 你还没有初始化 i,所以你正在写入一些随机内存地址,可能你正在调试模式下编译,编译器将变量设置为 0,但在一般情况下 -不要这样做

if (i < DIM) - 您不需要它,因为 i 循环后将指向 \n 之后的下一个符号,或者它将等于 DIM-1, so justmainArray[ i]='\0';` 就够了

auxArray[m]=i; - m 未初始化

for (i=0 ; i < m ; ++i) 我无法理解这个循环的逻辑,尤其是 mainArray[n]=mainArray[n+1]; - 你没有改变 n。存储 spaces 索引的整个方法是错误的,在删除至少一个 space 序列后 - 数组中的所有索引都变成了错误的索引。

这里有一点不同的版本,只有一个数组:

#include <stdio.h>
#include <string.h>
#define DIM 100

int main(int argc, char **argv)
{
    char mainArray [DIM]={'[=10=]'};
    int i, j, k;

    printf("Enter a string containing two or more consecutive spaces:\n");

    fgets(mainArray, DIM, stdin); // note: last symbols of the array will be \n[=10=]
    mainArray[strlen(mainArray)-1] = '[=10=]'; // trimming \n

    printf("[%s]\n", mainArray);

    for (i=0; mainArray[i] != '[=10=]' ; ++i) {
        if (mainArray[i] == ' ') {
            for (j=(i+1); mainArray[j]==' '; ++j) ; // calculate end of space sequence, j will point to the first non space symbol
            for (k=j; mainArray[k]!='[=10=]'; ++k) // copy rest of string to the position after first space
                mainArray[i+1+(k-j)] = mainArray[k];
            mainArray[i+1+(k-j)] = '[=10=]'; // put null-terminator
        }
    }

    printf("[%s]\n", mainArray);
    return 0;
}

这是仅使用 char* 指针的替代方法:

#include <stdio.h>
#include <string.h>

int
main(void)
{
    char *lhs;
    const char *rhs;
    int chr;
    char mainArray[500];

    fgets(mainArray,sizeof(mainArray),stdin);

    lhs = strchr(mainArray,'\n');
    if (lhs != NULL)
        *lhs = 0;

    printf("INP: '%s'\n",mainArray);

    lhs = mainArray;
    rhs = mainArray;

    for (chr = *rhs++;  chr != 0;  chr = *rhs++) {
        *lhs++ = chr;
        if (chr != ' ')
            continue;

        for (chr = *rhs;  chr != 0;  chr = *++rhs) {
            if (chr != ' ')
                break;
        }
    }

    *lhs = 0;

    printf("OUT: '%s'\n",mainArray);

    return 0;
}

更新: 上面重新编码以使用索引。请注意,它更冗长没有什么好的效果。但是,逻辑仍然很简单。这是要点之一。为了将来参考,保持您的逻辑很重要 "as simple as possible--and no simpler",因为当项目增长时,无论是好是坏,效果都会被放大。

#include <stdio.h>
#include <string.h>

int
main(void)
{
    char *cp;
    int lhs;
    int rhs;
    int chr;
    char mainArray[500];

    fgets(mainArray,sizeof(mainArray),stdin);

    cp = strchr(mainArray,'\n');
    if (cp != NULL)
        *cp = 0;

    printf("INP: '%s'\n",mainArray);

    lhs = 0;
    rhs = 0;

    for (chr = mainArray[rhs++];  chr != 0;  chr = mainArray[rhs++]) {
        mainArray[lhs++] = chr;
        if (chr != ' ')
            continue;

        for (chr = mainArray[rhs];  chr != 0;  chr = mainArray[++rhs]) {
            if (chr != ' ')
                break;
        }
    }

    mainArray[lhs] = 0;

    printf("OUT: '%s'\n",mainArray);

    return 0;
}

此外,请在此处查看我的回答:

它是关于结构数组的[这似乎有点高级]但只是假装 partition 类型是 typedef int partitiontypedef char partition。另外,请参阅关于 int 数组和指针可互换的最后一部分。