从C字符串中删除字符
问题描述:
给定一个字符串(作为函数的参数),在给定字符组合后,如果退出(它只是修改字符串),我需要删除零序列。例如,如果字符组合为x+
,则字符串20.301x+000005
必须转换为20.301x+5
。从C字符串中删除字符
我尝试这样做:
void convertStr(char *analysisBuffer)
{
char *exp;
if((exp = strstr(analysisBuffer,"x+"))!=NULL||(exp = strstr(analysisBuffer,"X+"))!= NULL)
{
exp += 2;
char * zeroIt = exp;
while(*zeroIt == '0')
++zeroIt;
unsigned int x = exp - analysisBuffer;
analysisBuffer[x] = '\0';
strcat(analysisBuffer,zeroIt);
}
}
谁能告诉我如何正确地执行呢?
答
这是为表达 的多次出现的作品,并降低一个版本字符串的大小,以便内存不被占用零结束符。这可能会更慢,并且完全没有必要 但是,您可以感受到做一些奇特的事情。
声明:我很久没有写过任何纯C了。
#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;
}
答
喜欢的东西
char * write = str;
char * read = str;
while(*read){
while(*read && *read == '0'){ read++; }
*write++ = *read++;
}
*write = '\0';
? (这是未经测试)
答
下面是一个更完整的例子,你想要什么。我试图改进几项:
- 使用
strcasestr
函数进行不区分大小写的测试。 (为此,我们需要#define _GNU_SOURCE
) - 使用
strcat
(与您一样)将字符串的尾部附加到头部。 - 注意将字符串定义为
char test[] = "..."
而不是char *test = "..."
,因为后者将会出现段错误。 - 有一个'如果'来看看我们是否必须跳过一个或多个'0'。
- 您可以使用像
rindex()
这样的函数来排除while
循环,该函数给出字符串中字符最右侧的索引。
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void
convertStr(char *analysisBuffer)
{
char *exp = strcasestr(analysisBuffer, "x+");
if (exp) {
exp += 2;
if (*exp == '0') {
while (*exp == '0') {
*exp = '\0';
exp++;
}
strcat(analysisBuffer, exp);
}
}
}
int
main(int argc, char *argv[])
{
char test[] = "20.301X+0005";
printf("before: %s\n", test);
convertStr(test);
printf("after : %s\n", test);
return EXIT_SUCCESS;
}
答
相反的:
unsigned int x = exp - analysisBuffer;
analysisBuffer[x] = '\0';
strcat(analysisBuffer,zeroIt);
你可能只是做:
memmove(exp, zeroIt, strlen(zeroIt) + 1);
答
size_t strip0(char *buff);
size_t strip0(char *buff)
{
size_t src,dst;
for (src=dst=0; buff[dst] = buff[src++] ;dst++) {
if ((buff[dst] == 'x' || buff[dst] == 'X') && buff[src] == '+') {
buff[++dst] = buff[src++] ;
while (buff[src] == '0') src++;
}
}
return dst;
}
#include <stdio.h>
int main(int arc, char **argv)
{
char data[] = "100x+003 aap 200x+300 100X+003 noot 200X+300 mies 1234xX+000000000zzz";
printf("Org: %s\n", data);
strip0(data);
printf("New: %s\n", data);
return 0;
}
您是指'analysisBuffer [X] = '\ 0';'代替'analysisBuffer [0] = '\ 0';'? – tdk001
重申您的要求:删除给定序列后发生的所有“0”。是否有必要修改字符串或允许复制? – pmr
只修改字符串 – Yakov