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

时间:2015-03-20 11:15:34

标签: c pointers replace char strcpy

我在C中执行了一个函数,我在char letters[]字段中存储了我想要的功能char available[]删除/省略只是在字段中的功能。

我在这里找到了stackoverflow 替换函数,我覆盖了字符串。该功能可以按照我的意愿运行,但我已经把它放在那里用于节目。 问题出现在函数调用和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] = '\0';
    sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig));
    return buffer;
}

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

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

   getAvailableLetters(letters, available);
}

在这种情况下,输出应为:" bcdfhjklmnqvwz " 但函数会返回所有字母。

应该覆盖char available[]

中存在的char letters[]字符的函数
void getAvailableLetters(char letters[], char available[]) {
    char copy[30][30];
    memset(copy, '\0', 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]。由于需要将每个变量只取一个点,我可以直接替换它。如果我使用&#39; &amp; &#39;,作为&#39; <的函数强> replace_str &#39;在char *orig中是\237类型的示例,并且立即替换函数不执行任何更改。

我发现,如果你给strcpy(copy[d], replace_str(copy[i], "a", ""));这样它可以正常工作,但是整个字母再次通过开关,当然不会。

那么,请问,如何处理我没有必要切换到每个字母,并以这种方式有效地做到这一点。 感谢。

1 个答案:

答案 0 :(得分:0)

你的replace_str函数使用一个有限大小的静态缓冲区 不是线程安全的。不要这样做。

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

我建议先构建一个查找表:

char allowed_letters[256];

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

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

现在你有一个查找表,告诉我们允许哪些字母和哪些字母 禁止的。

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

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

然后执行以下操作:

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

并且不要忘记&#39; \ 0&#39; - 终止输出字符串。