所以我在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”。
答案 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>
。)