我有这样的功能:
bool filtruj(char* text, bool(*f)(char)) {
while(*(text)!='\0')
{
bool sprawdzWartosc = f(*(text));
if(sprawdzWartosc)
{
printf("run");
b=*(text);
while(b!='\0')
{
printf("run2");
*(text) = *(text+1);
text++;
}
}
}
return false;
}
当sprawdzWartosc为true时,删除此char并将其他字符向左移动一个。
问题是: 如何回到var sprawdzWartosc中使用的指针位置?因为当我移动字符时,我的指针位于*(文本)的末尾。
我不能使用int,short,long变量,只能使用指针。
答案 0 :(得分:1)
b=*text;
while(b!='\0')
// ...
这只会持续比较相同的字符b
,它永远不会是\0
。
也许你想使用另一个指针?
这是我想要实现的想法: Live on Coliru
bool filter(char* text, bool(*pred)(char)) {
char* out = text;
while (*text)
{
if (pred(*text))
{
++text; // just skip
} else
{
*out++ = *text++; // copy out
}
}
*out = '\0';
return (out != text); // true if characters were filtered
}
#include <cctype>
#include <cstring>
#include <cstdio>
bool foo(char c)
{
return isalpha((int)(unsigned char)c);
}
void test(const char* input)
{
char* s = strdup(input);
printf("%s -> ", s);
bool b = filter(s, foo);
printf("%s (%s)\n", s, b?"true":"false");
}
int main()
{
test("12346 234890-98 .");
test("12a46 awesome-98!");
}
打印
12346 234890-98 . -> 12346 234890-98 . (false)
12a46 awesome-98! -> 1246 -98! (true)
答案 1 :(得分:0)
我认为你要做的是遍历字符串的主体并删除对f
的调用返回true的字符。
bool filtruj(char* text, bool(*f)(char)) {
while(*(text)!='\0') {
bool sprawdzWartosc = f(*(text));
if(sprawdzWartosc) {
for (char* cur = text; *cur; ++cur) {
*cur = *(cur+1);
}
}
}
return false;
}
请注意,您的原始代码执行了此操作
b = *(text);
while (b != '\0')
作业b = *(text)
将地址文本当前指定的当前值复制到变量b中 - 它不会生成b
神奇地跟踪文本的当前值。
int i = 5;
int* ptr = &i;
int j = *ptr;
++i;
printf("j = %d\n", j);
打印5,而不是6。