Avatar billede driis Nybegynder
03. april 2003 - 18:37 Der er 6 kommentarer og
2 løsninger

Fjerne 2 bytes fra streng og erstatte dem med ét

Jeg har følgende problem: Jeg har en funktion som modtager en pointer til et char atray. Hvis char array'et indeholder de 2 bytes T7B+T7C eller T7B+T7D, skal disse erstattes med hhv. FLAG eller T7B ( altså kun ét tegn )
T7B, T7C, T7D, FLAG er konstanter.
Jeg har skrevet flg. kode:

int dlLag::fjernStartStop(char *in, int l)
{
    char buf[1050];
    int p = 0 ;
    for ( int i = 0 ; i < l ; i++ )
    {
        if ( in[i] == T7B )
        {
            if ( in[i+1] == T7C )
            {
                buf[p] = FLAG ; 
            }
            if ( in[i+1] == T7D )
            {
                buf[p] = T7B  ; 
            }
            i++;
        }else
        {
            buf[p] = in[i] ;
        }
        p++;
    }
   
    for ( int i = 0 ; i < p ; i++ )
        in[i] = buf[i] ;
    in[p] = 0 ;

    return p ;
}

Det virker ikke. Selvom strengen jeg sender med indeholder én af de 2 byte sekvenser, erstattes de ikke, som de skal. Hvad har jeg gjort forkert, og hvordan får jeg det til at virke ? Kan det gøres smartere ?
Avatar billede arne_v Ekspert
03. april 2003 - 18:59 #1
Øh - det virker hos mig !

#include <stdio.h>
#include <string.h>

#define T7B 'B'
#define T7C 'C'
#define T7D 'D'
#define FLAG 'A'

int fjernStartStop(char *in, int l)
{
    char buf[1050];
    int p = 0 ;
    for ( int i = 0 ; i < l ; i++ )
    {
        if ( in[i] == T7B )
        {
            if ( in[i+1] == T7C )
            {
                buf[p] = FLAG ;
            }
            if ( in[i+1] == T7D )
            {
                buf[p] = T7B  ;
            }
            i++;
        }else
        {
            buf[p] = in[i] ;
        }
        p++;
    }
 
    for ( int i = 0 ; i < p ; i++ )
        in[i] = buf[i] ;
    in[p] = 0 ;

    return p ;
}

int main()
{
  char s[9];
  strcpy(s,"ABCDABCD");
  fjernStartStop(s, strlen(s));
  printf("%s\n",s);
}


outputter:

AADAAD
Avatar billede arne_v Ekspert
03. april 2003 - 18:59 #2
Jeg har naturligvis forsimplet lidt men det er samme kode.
Avatar billede driis Nybegynder
03. april 2003 - 19:28 #3
Mærkeligt ... kan jeg lokke dig til at forsøge med de samme konstanter, som jeg bruger ?
const char FLAG = 0x7E;
const char T7B = 0x7B;       
const char T7C = 0x7C;
const char T7D = 0x7D;
Avatar billede arne_v Ekspert
03. april 2003 - 20:01 #4
Hm.

#include <stdio.h>
#include <string.h>

const char FLAG = 0x7E;
const char T7B = 0x7B;     
const char T7C = 0x7C;
const char T7D = 0x7D;

int fjernStartStop(char *in, int l)
{
    char buf[1050];
    int p = 0 ;
    for ( int i = 0 ; i < l ; i++ )
    {
        if ( in[i] == T7B )
        {
            if ( in[i+1] == T7C )
            {
                buf[p] = FLAG ;
            }
            if ( in[i+1] == T7D )
            {
                buf[p] = T7B  ;
            }
            i++;
        }else
        {
            buf[p] = in[i] ;
        }
        p++;
    }
 
    for ( int i = 0 ; i < p ; i++ )
        in[i] = buf[i] ;
    in[p] = 0 ;

    return p ;
}

int main()
{
  char s[9];
  strcpy(s,"ABCD\x7B\x7C\x7B\x7D");
  printf("%d\n",fjernStartStop(s, strlen(s)));
}

skriver 6 ud, så jeg tror den erstatter OK.
Avatar billede driis Nybegynder
03. april 2003 - 20:05 #5
Nu virker det. Fejlen lå ikke i denne funktion men et andet sted i klassen - jeg kom til at bruge en forkert pointer - en gang i mellem kan man vist stirre sig blind på en fejl ;-)

Jeg vil gerne give point for din hjælp, hvis du lægger et svar.
Avatar billede arne_v Ekspert
03. april 2003 - 20:08 #6
svar
Avatar billede arne_v Ekspert
03. april 2003 - 20:08 #7
Og det med at stirre sig blind på et problem kender alle
programmører vist.
Avatar billede driis Nybegynder
03. april 2003 - 20:45 #8
;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester