从数组中选择一个字符并随后替换第二个数组 - C

Choosing a character from the array and subsequent replace the second array - C

我在 C 中做一个函数,我在字段 char letters[] 中存储我想要的功能 char available[] 删除/省略字段中没有的功能。

我在这里找到了覆盖字符串的Whosebug replace函数。该功能按我的意愿工作,但我已将其放在那里进行展示。 问题出在函数调用和char letters[].

的调用字母上

替换函数

char *replace_str(char *str, char *orig, char *rep) {
    static char buffer[4096];
    char *p;
    if(!(p = strstr(str, orig))) return str;
    strncpy(buffer, str, p-str); 
    buffer[p-str] = '[=10=]';
    sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig));
    return buffer;
}

在我的主函数中调用一个函数。

int main() {
   char letters[] = "arpstxgoieyu";
   char available[] = "abcdefghijklmnopqrstuvwxyz";

   getAvailableLetters(letters, available);
}

在这种情况下,输出应该是:“bcdfhjklmnqvwz 但函数 return me all the letters.

应该覆盖 char letters[]

中存在的 char available[] 字符的函数
void getAvailableLetters(char letters[], char available[]) {
    char copy[30][30];
    memset(copy, '[=12=]', sizeof(copy));
    strcpy(copy[0], available);
    int d = 1;
    for (int i = 0, length = (int)strlen(letters); i < length; i++, d++) {
        strcpy(copy[d], replace_str(copy[i], &letters[i], ""));
    }

    strcpy(available, copy[d-1]);
}

&letters[i] 有问题。因为需要每个变量只取一个点,所以我可以将它替换进去。如果我使用'&',作为'[=56的函数=]' in char *orig 是类型 7 的示例,立即替换函数不执行任何更改。

我发现如果你给 strcpy(copy[d], replace_str(copy[i], "a", "")); 这样它就可以工作,但是再次对整个字母表进行切换,肯定不会。

请问如何处理我不必切换到每个字母并以这种方式有效地处理。 谢谢。

您的 replace_str 函数使用了一个大小有限的静态缓冲区,并且 不是线程安全的。不要那样做。

所以,如果我没理解错的话,你有一串字母和另一个字符串, 并希望从中构造另一个字符串,从中指定 字母已被删除。

我建议首先构建一个查找 table:

char allowed_letters[256];

(您可以通过使用带有位移位和掩码的位数组来进行微优化,但是 那只会节省几个字节的内存,所以不值得)

然后,使用for循环初始化allowed_letters所有的,并循环 字符串字母并设置 allowed_letters[(unsigned char)letters[i]] = 0;

现在你有一个查询 table 它告诉你哪些字母是允许的,哪些是 禁止.

然后你需要考虑你想把结果存储在哪里。一种选择是 是使用另一个字符串缓冲区,可能分配给 malloc(strlen(可用)+1)。或者您可能想要一个就地算法 覆盖可用字母的字符串。

无论如何,无论哪种方式,您都需要管理一个指向的输出指针 (outp) 输出字符串中的位置(无论是单独的内存块还是 原始可用字符串)和输入指针(inp)指向 您正在阅读的输入字符串的位置。

然后做类似的事情:

while (*inp)
{
  if (allowed_letters[(unsigned char)*inp])
    *outp++ = *inp++;
  else
    inp++;
}

并且不要忘记以 '\0' 结束输出字符串。