我在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", ""));
这样它可以正常工作,但是整个字母再次通过开关,当然不会。
那么,请问,如何处理我没有必要切换到每个字母,并以这种方式有效地做到这一点。 感谢。
答案 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; - 终止输出字符串。