回到指针的位置

时间:2013-12-02 23:57:45

标签: c++ pointers

我有这样的功能:

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变量,只能使用指针。

2 个答案:

答案 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。