Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C (http://www.go4expert.com/forums/c/)
-   -   how to find and replace some group of characters in a char string with bytes? *basic (http://www.go4expert.com/forums/replace-characters-char-string-bytes-t17472/)

Owyn 12May2009 01:57

how to find and replace some group of characters in a char string with bytes? *basic
 
hi, some basic help i need here or not (=

1. i need to replace every "\4" word with 04 hex byte

2. i need to replace every "a" symbol with "b" symbol after "\r" word but not after "\e" word,
replace "a" symbol with "b" symbol just until there is a "\e" word, after "\e" no replaceing "a" symbol with "b" symbol, but if there is an "\r" somewhere after "\e" - so replace

hope you help me ^^"

xpi0t0s 12May2009 13:17

Re: how to find and replace some group of characters in a char string with bytes? *ba
 
Sounds fairly easy. How far have you got and where are you stuck?
I would implement this using a flag to track whether or not a "\e" (whatever that is) has occurred and replace "a" with "b" only if that flag is set. Also I'd use a counter for the first part and reset it every time I did a substitution. IOW, something like:
Code:

flag=1
counter=0
get symbol
counter++
if counter=4
  symbol=04 hex byte (whatever that means)
  reset counter
end if
if symbol="\e"
  flag=0
else if symbol="\r"
  flag=1
else if symbol="a" and flag=1
  symbol="b"
end if

However you need to think about what will happen if the 4n-th symbol is a \e or \r - will the substitution of this for an "04 hex byte" stop the flag being set accordingly? If not, how do you think you might change the above code to fix that?

Owyn 12May2009 15:25

Re: how to find and replace some group of characters in a char string with bytes? *ba
 
1 Attachment(s)
hex i mean... like this +_+ *look attach

every "\4" should be replaced with 04 hex byte no matter about other things

Quote:

counter++
sounds like it loop thru every 2 symbols? what if it stops looking at two symbols "h\" for e.g. and next would be "r " so it wont find the "\r" ?

i'm new at C++ but looping thru symbols and replaceing them looks easy (at least with my knowlegde of PAWN) but i think i'm stuck with condition of replacing and not replaceing if markers were found like i need to mark string from \r to \e (if \e is after, + even if it's not) to replace things and mark string from \e to \r (if \r is after, + even if it's not) to not replace
i heard C++ has enchanced abilities to work with strings such way but i'm not sure

xpi0t0s 12May2009 20:15

Re: how to find and replace some group of characters in a char string with bytes? *ba
 
What exactly do you mean by a symbol? How many of them can you see on the highlighted line in the screen shot?

Is there a \4 on the screenshot, and if not could you post a screen shot that shows one?

Owyn 12May2009 21:38

Re: how to find and replace some group of characters in a char string with bytes? *ba
 
a symbol, a character, a letter
anyway i think i found how to write bytes
Code:

data.push_back(0x04);

Owyn 12May2009 23:34

Re: how to find and replace some group of characters in a char string with bytes? *ba
 
output for text from test string is "bbcdefbbcdefabcdef"

when i use for input "hi" it outputs " . hi" (20 2E 14 20 68 69 in hex) and it conver every a to b, and when i input "\\s" it outputs either "sss" or "s\s" O_o

can you look at my code and maybe tell me something how to fix it?
Code:

// Modifier functor.
struct Modify : public std::unary_function<char, void>
{
    // Constructor.
    Modify() : slash(false), a_to_b(true)
    {
    }

    // () operator.
    void operator () (char c)
    {
        // Did we gat a '\' last time?
        if (slash)
        {
            // Enable 'a' to 'b'
            if (c == 'r')
            {
                a_to_b = true;
            }
            // Disable 'a' to 'b'
            else if (c == 'e')
            {
                a_to_b = false;
            }
            // It was a '4'
            else if (c == '4')
            {
                data.push_back(0x04);
            }

            // Done with the '\'
            slash = false;
        }
        else
        {
            // Is the current character a '\' ?
            slash = (c == '\\');

            if (!slash)
            {
                if ((c == 'a') && a_to_b)
                {
                    // Modify 'a' to 'b'
                    data.push_back('b');
                }
                else
                {
                    // Just copy
                    data.push_back(c);
                }
            }
        }
    }

    // Result.
    std::vector<char> data;

private:
   
    // Flags.
    bool slash;
    bool a_to_b;
};



void func_xsay()
{

        char msg[384];

        for(int i=1; i < args; i++)
        {
        sprintf(msg,"%s %s",msg,oEngfuncs.Cmd_Argv(i));
        }

        // Test string
    std::string text("abcdef\\rabc\\4def\\eabcdef\\4");
        //text = msg;


    // Make the data.
    std::vector<char> data(text.begin(), text.end());


    // Create the functor.
    Modify modify;

    // Run the functor over all the data.
    modify = std::for_each(data.begin(), data.end(), modify);

    // Read back the modified data.
    data = modify.data;


        //make msg = data;
        for (int i = 0; i < data.size(); i++)

        {

        msg[i] = data[i];

        }
       

        wsprintf(cmd,"you say %s",msg);


}



All times are GMT +5.5. The time now is 10:18.