从数组中选择一个字符并随后替换第二个数组 - 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' 结束输出字符串。
我在 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' 结束输出字符串。