gpt4 book ai didi

c - 从C中的字符串中删除出现的数组

转载 作者:行者123 更新时间:2023-11-30 14:46:18 24 4
gpt4 key购买 nike

我的代码遇到循环问题。我有一个接受两个字符数组(短语、字符)的方法。字符数组包含必须单独读取并与短语进行比较的字符。如果匹配,则该字符的每次出现都将从短语中删除。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//This method has two parameters: (str, c)
//It will remove all occurences of var 'c'
//inside of 'str'
char * rmstr(char * c, char * str) {

//Declare counters and pointers
int stemp = 0;
int ctemp = 0;
char *p = str;
char *d = c;
//Retrieve str count
while(str[stemp] != '\0') {
stemp++;
}
//Retrieve c count
while(c[ctemp] != '\0') {
ctemp++;
}
//Output information
printf("String Count: %d\n",stemp);
printf("Character Count: %d\n",ctemp);
//Iterate through arrays
for (int i = 0; i != stemp; i++) {
for (int j = 0; j != ctemp; j++) {
if (c[j] != str[i]){
*p++ = str[i];
}
break;
}
printf("%s\n",str);
}
*p = 0;
return str;
}

int main()
{
char c[256] = "ema";
char input[256] = "Great message!";
char *result = rmstr(c, input);
printf("%s", result);
return 0;
}

在这种情况下,输入将是“Great Message!”以及我想删除所有出现的字符的字符:e、m、a(如 main 中指定)。

使用上面的代码,输出如下:

Grat mssag!

它仅循环 1 次迭代并删除 'e'。我希望它也循环遍历“m”和“a”。

最佳答案

修复导致内部循环退出的 break; 后,重新排序循环并循环遍历要删除的字符,同时检查 str 中的字符可能是有意义的。这更方便,如果 str 中的每个字符与 c 匹配,您可以将其随机排列一个。如果您使用 string.h 中的函数(例如 memmove)来向下移动字符,那么这并不重要。

仅使用指针手动通过 str 删除 c 中的所有字符的简单实现可能如下所示:

#include <stdio.h>

char *rmstr (char *str, const char *chars)
{
const char *c = chars; /* set pointer to beginning of chars */
while (*c) { /* loop over all chars with c */
char *p = str; /* set pointer to str */
while (*p) { /* loop over each char in str */
if (*p == *c) { /* if char in str should be removed */
char *sp = p, /* set start pointer at p */
*ep = p + 1; /* set end pointer at p + 1 */
do
*sp++ = *ep; /* copy end to start to end of str */
while (*ep++); /* (nul-char copied on last iteration) */
}
p++; /* advance to next char in str */
}
c++; /* advance to next char in chars */
}
return str; /* return modified str */
}

int main (void) {

char c[] = "ema";
char input[] = "Great message!";

printf ("original: %s\n", input);
printf ("modified: %s\n", rmstr (input, c));

return 0;
}

(有很多方法可以做到这一点——具体方法很大程度上取决于您。是否使用上面的指针,或者获取长度并使用字符串索引也是一个选择问题)

示例使用/输出

$ ./bin/rmcharsinstr
original: Great message!
modified: Grt ssg!

如果您确实想使用 memmove (以解决源和目标的重叠性质)将 str 中的剩余字符每次移动一个字符in strc 中的字符匹配,您可以将循环保留为原始顺序,例如

#include <string.h>

char *rmstr (char *str, const char *chars)
{
char *p = str; /* set pointer to str */
while (*p) { /* loop over each char in str */
const char *c = chars; /* set pointer to beginning of chars */
while (*c) { /* loop over all chars with c */
while (*c == *p) { /* while the character matches */
memmove (p, p + 1, strlen (p)); /* shuffle down by 1 */
c = chars; /* reset c = chars to check next */
}
c++; /* advance to next char in chars */
}
p++; /* advance to next char in str */
}
return str; /* return modified str */
}

(确保您了解为什么在这种情况下必须重置 c = chars;)

最后,如果您确实想要简写方式来执行此操作,您可以使用 strpbrkmemmove 并将函数简化为:

#include <string.h>

char *rmstr (char *str, const char *chars)
{
/* simply loop using strpbrk removing the character found */
for (char *p = strpbrk (str, chars); p; p = strpbrk (str, chars))
memmove (p, p+1, strlen(p));

return str; /* return modified str */
}

(在 C 语言中给猫剥皮的方法总是不止一种)

输出是相同的。请查看这里的内容,如果您还有其他问题,请告诉我。

关于c - 从C中的字符串中删除出现的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52359993/

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