gpt4 book ai didi

c - 使用 strchr 从数组中删除字符,在普通 C 中不返回正确的值

转载 作者:太空宇宙 更新时间:2023-11-04 05:44:54 25 4
gpt4 key购买 nike

我正在尝试从值为以下的字符数组中删除第一个分号:

Input:
; Test: 876033074, 808989746, 825766962, ; Test1: 825766962,

代码:

 char *cleaned = cleanResult(result);
printf("Returned BY CLEAN: %s\n",cleaned);



char *cleanResult(char *in)
{
printf("Cleaning this: %s\n",in);

char *firstOccur = strchr(in,';');
printf("CLEAN To Remove: %s\n",firstOccur);
char *restOfArray = firstOccur + 2;
printf("CLEAN To Remove: %s\n",restOfArray); //Correct Value Printed here

char *toRemove;
while ((toRemove = strstr(restOfArray + 2,", ;"))!=NULL)
{
printf("To Remove: %s\n",toRemove);
memmove (toRemove, toRemove + 2, strlen(toRemove + 2));
printf("Removed: %s\n",toRemove); //Correct Value Printed
}

return in;
}

Output (first semicolon still there):
; Test: 876033074, 808989746, 825766962; Test1: 825766962;

最佳答案

关于 sizeof(cleaned):使用 sizeof 获取数组的容量仅在参数为数组而非指针时有效:

char buffer[100];
const char *pointer = "something something dark side";

// Prints 100
printf("%zu\n", sizeof(buffer));

// Prints size of pointer itself, usually 4 or 8
printf("%zu\n", sizeof(pointer));

虽然本地数组和指针都可以下标,但是当涉及到sizeof 时它们的行为不同。因此,您无法仅通过指向数组的指针来确定数组的容量。

此外,请记住这一点:

void foo(char not_really_an_array[100])
{
// Prints size of pointer!
printf("%zu\n", sizeof(not_really_an_array));

// Compiles, since not_really_an_array is a regular pointer
not_really_an_array++;
}

尽管 not_really_an_array 声明为数组,但它是一个函数参数,因此实际上是一个指针。它与以下内容完全相同:

void foo(char *not_really_an_array)
{
...

不太合逻辑,但我们坚持了下来。


关于你的问题。我不清楚你想做什么。简单地删除字符串的第一个字符(就地)可以使用 memmove 完成:

memmove( buffer             // destination
, buffer + 1 // source
, strlen(buffer) - 1 // number of bytes to copy
);

这需要线性时间,并假设 buffer 不包含空字符串。

strcpy(buffer, buffer + 1) 不会执行的原因是字符串重叠,因此这会产生未定义的行为。但是,memmove 明确允许源和目标重叠。

对于更复杂的字符过滤,您应该考虑手动遍历字符串,使用“读”指针和“写”指针。只需确保写入指针不会领先于读取指针,这样字符串在读取时就不会被破坏。

void remove_semicolons(char *buffer)
{
const char *r = buffer;
char *w = buffer;

for (; *r != '\0'; r++)
{
if (*r != ';')
*w++ = *r;
}

*w = 0; // Terminate the string at its new length
}

关于c - 使用 strchr 从数组中删除字符,在普通 C 中不返回正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8422738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com