删除/替换字符数组中的两个或多个连续字符

时间:2015-10-29 01:06:13

标签: c arrays string algorithm substitution

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

  • 从stdin中读取一定量的字符并将它们存储在一个数组中;
  • 只替换一个连续两个或多个空格('');
  • 回写数组。

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

#include <stdio.h>
#define DIM 100

int main(int argc, char **argv)
{
    char mainArray [DIM]={'\0'};
    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 '\0' */
    if (i < DIM)
        mainArray[i]='\0';
    else
        mainArray[DIM-1]='\0';

    l=i;

/* My substitution algorithm */
    for (i=0 ; mainArray[i] != '\0' ; ++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] != '\0' ; ++i)
        printf("%c", mainArray[i]);

    return 0;
}

例如,输入字符串&#34; a_long_time_ago ___ in_a_galaxy__far ____,_ far_away ..&#34;会产生&#34; a_long_time_ago_in_a_galaxy_far _,_ far_away ..&#34;

对于替换算法,我认为可能的一种可能性是存储空间的位置,然后通过辅助数组删除主数组中的空格。

我确信我犯了一些错误。另外,您认为如何优化代码?

提前谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

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

int main(int argc, char **argv)
{
    char mainArray [DIM]={'\0'};
    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\0
    mainArray[strlen(mainArray)-1] = '\0'; // trimming \n

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

    for (i=0; mainArray[i] != '\0' ; ++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]!='\0'; ++k) // copy rest of string to the position after first space
                mainArray[i+1+(k-j)] = mainArray[k];
            mainArray[i+1+(k-j)] = '\0'; // put null-terminator
        }
    }

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

答案 1 :(得分: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;
}

更新:以上重新编码使用索引。请注意,没有好的效果会更加冗长。但是,逻辑仍然很简单。这是要点之一。为了将来参考,保持您的逻辑尽可能简单是重要的 - 并且没有更简单的&#34;因为当项目增长时,效果会因善恶而放大。

#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;
}

另外,请在此处查看我的回答:Issue implementing dynamic array of structures

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