gpt4 book ai didi

c - 从 Char 数组中删除某些元素

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

我有一个函数可以从给定的字符串中去除标点符号,并将其所有内容变为小写:

void stripPunctuators(char *str)
{
int i, j, len = strlen(str);


for (i = 0; i < len; i++)
{
if (!isalpha(str[i]))
{
for (j = i; j < len; j++)
{
str[j] = str[j + 1];
}
len--;
}

str[i] = tolower(str[i]);
}
}

但由于某些原因,当我连续有两个非字母字符时,它会遇到麻烦......这是我的主要功能:

 int main(void)
{
char str[50] = "Hello.";

printf("Before strip: %s\n", str);
stripPunctuators(str);
printf("After strip: %s\n", str);

char str2[50] = "Hello.!";

printf("Before strip: %s\n", str2);
stripPunctuators(str2);
printf("After strip: %s\n", str2);

return 0;
}

最后,这是我的输出:

Before strip: Hello.
After strip: hello
Before strip: Hello.!
After strip: hello!

感谢您的帮助!

最佳答案

考虑一个短字符串可能会有所帮助,例如 a!@b。由于您使用了 for 循环,您的 index 变量将遍历 0..3 值(包括在内)。现在按照顺序:

0123     <- indexes
----
a!@b starting point, index = 0
a!@b index 0 was a, no shift, set index to 1
a@b index 1 was !, shift, set index to 2 ***
a@b index 2 was b, no shift, set index to 3, exit loop

由此,您应该能够看到移动字符串的剩余部分 增加索引将导致跳过下一个字符(参见 *** 出错地方的标记)。

您可以通过使用一个循环来解决这个问题,在该循环中,当您进行轮类时索引不会递增(可能使用 while 而不是 for 会是个好主意)。这样,不增加的移位会让您重新检查相同索引,这是下一个字符(由于移位)。

但是,每次要删除一个字符时都对字符串余数进行一次完整移位是相当低效的,因为很有可能您可能需要再次更改这些字符。

你最好使用类似(伪代码)的源和目标指针:

set src and dst to address of first character
while character at src is not end-of-string:
if character at src is not punctuation:
set character at dst to be character at src
increment dst
increment src
set character at dst to be end-of-string

而且,如果你想在 C 中使用它,它会遵循以下行:

void stripPunctuators(char *str) {
char *src = str;
char *dst = str;
while (*src != '\0') {
if (isalpha(*src)) {
*dst = *src; // or combine:
dst++; // "*dst++ = *src"
}
src++;
}
*dst = '\0';
}

Note that I've used isalpha in my code simply because that's the one you used in your original code. Since that will strip more than punctuation (digits, for example), you may want to re-examine whether it's the right one to use. The isalnum function may be more apt but it also depends on your use case. You may need to preserve spaces as well.

Otherwisethingsmaygetverymessyandhardtoread :-)

关于c - 从 Char 数组中删除某些元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51353222/

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