删除字符串的子串

时间:2014-09-09 15:38:26

标签: c

所以我在Talentbuddy(对于那些知道的人)做了一些编码练习,我不知道为什么我不能完成这个。 exercice是从字符串中删除子字符串,作为输入字符串给出,位置P开始删除字符,N是需要删除的字符数。

这就是我所做的:

#include <stdio.h>
#include <unistd.h>

void remove_substring(char *s, int p, int n) 
{
    int idx;

    idx = -1;
    while (s[++idx] != '\0')
       write(1, &s[idx == p - 1 ? idx + n : idx], 1);
}

当输入为“abcdefghi”时,P = 9且N = 1,给出的结果是“abcdefgh”与我的函数完全相同。但是TalentBuddy一直在告诉我,我的输出是错误的,我不认为他(talentbuddy)是错的。 也许“h”和“\ 0”之间有空格或空格。 但是当我在最后添加另一个写(1,“END”,3)时,我无法想象它会出现像“abcdefghEND”。

2 个答案:

答案 0 :(得分:1)

如果问题仅针对字符串(NULL终止) 为什么不能这样简单,除非它是一个功课。

void removesubstr( const char *string, const char *substring )
{
        char *p = strstr(string, substring);
        if(p)
        {
                strcpy(p,p+strlen(substring));
        }
}

答案 1 :(得分:0)

你的问题是你为每个原始索引写了一些东西,即使它应该被抑制。你写的内容看起来像abcdefgh,但它是abcdefgh<nul>,终端不会呈现<nul>

你在这里混合两种方法。过滤掉删除的子字符串:

void remove_substring(char *s, int p, int n) 
{
    int i = 0;

    p--;        /* convert to C-style index */

    while (s[i] != '\0') {
       if (i < p || i >= p + n) putchar(s[i]);
       i++;
    }
}

或跳过子字符串跳过子字符串:

void remove_substring(char *s, int p, int n) 
{
    int i = 0;
    int l = strlen(s);

    while (i < l) {
        if (i + 1 == p) {
            i += n;
        } else {
            putchar(s[i++]);
        }
    }
}

你正试图做两件事。

(我避免了前缀增量的笨拙组合,从-1开始。我使用了putchar而不是unistd的写法。并且按长度终止是这样的不经意间跳过终止<nul>。)