Это версия, которая работает для нескольких вхождений выражения и уменьшает размер строки, так что никакая память не занята нулевыми терминаторами.Это, вероятно, медленнее и совершенно не нужно, но дает вам удивительное чувство делать что-то причудливое.
Отказ от ответственности: я давно не писал чистого Си.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* strip_zero(char* str, const char* startseq) {
// while there is an occurence of the substring
size_t ssize = strlen(startseq);
size_t oldlen = strlen(str) + 1; // account for terminator
size_t rems = 0;
char* begin = str;
while((begin = strstr(begin, startseq))) {
// move to the end of the sequence
begin += ssize;
char* walk = begin;
// walk until we reach nonzero
while(*walk == '0') { ++walk; ++rems; }
// move the string forward
memmove(begin, walk, strlen(walk) + 1);
}
// realloc the string
return (char*)realloc(str, oldlen - rems);
}
int main(void)
{
// make a copy so we can modify
const char* a = "x+20.301x+00000x+0005x+";
char* foo = (char*)malloc(strlen(a) + 1);
strcpy(foo, a);
printf("%s \n", foo);
foo = strip_zero(foo, "x+");
printf("%s \n", foo);
free(foo);
return 0;
}