繁体   English   中英

删除字符串的子字符串

[英]Remove substring of string

所以我在Talentbuddy上做了一些编码练习(针对那些知道的人),我不明白为什么我不能完成这个。 练习是从字符串中删除子字符串,该字符串作为输入输入,位置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”之间可能有空格或其他内容。 但是我无法弄清楚它的原因,当我在末尾添加另一个write(1,“ END”,3)时,它看起来像是“ abcdefghEND”。

如果问题只针对字符串(NULL终止),为什么不能这么简单,除非这是一项家庭作业。

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

您的问题是,即使应该取消对原始索引的写入,也要为其编写一些内容。 您编写的内容看起来像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的write。而且按长度的终止是这样,所以您不会无意中跳到终止的<nul> 。 )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM