Avatar billede frostholm Praktikant
24. maj 2002 - 12:53 Der er 13 kommentarer og
2 løsninger

Fjern nulterminering

Hejsa ..

Jeg ville høre om der var nogle der havde en ide til hvordan jeg kan lave en funktion der modtager en buffer (fx char tekst[200]), og resultere en streng uden nultermineringsstrenge.

Jeg har nemlig en stor buffer son består af mange strenge med hver deres \0, men de skal fjernes da der ikke må væres sådanne da den skal leveres videre til noget cobol.'

Mvh

Michael F
Avatar billede laffe Nybegynder
24. maj 2002 - 12:55 #1
Du vil altså have en funktion der fjerner alle nultermineringer i en lang buffer -  også det sidste ?
Avatar billede jpk Nybegynder
24. maj 2002 - 12:59 #2
Bare erstat med en anden karakter...
Avatar billede frostholm Praktikant
24. maj 2002 - 13:01 #3
nej ikke den sidste
Avatar billede chries Nybegynder
24. maj 2002 - 13:03 #4
#include "iostream.h"

void remove( int size, char input[], char output[] )
{
    int j = 0;

    for( int i=0; i < size; i++ )
    {
        if( input[i] != '\0' )
        {
            output[j] = input[i];
            j++;
        }
    }
}

int main(int argc, char* argv[])
{
    char input[128] = "drewijhfiwuehjfwioejfweiockweoi";
    char output[128];

    // insert et par nultermineringer
    input[3] = '\0';
    input[10] = '\0';
    input[15] = '\0';

    remove( 128, input, output );


    return 0;
}
Avatar billede laffe Nybegynder
24. maj 2002 - 13:03 #5
Fjerner alle '\0' fra Src og kopierer den nye streng over i Dst. srcLen angiver længden af Src.

void strip(char* Dst, char* Src, int srcLen)
{
  char* d;
  char* s;

  s = Src;
  d = Dst;
  for (int i=0; i<srcLen; i++)
  {
    if (*s != 0)
    {
      *d = *s;
      d++;
    }
    s++;
  }
}
Avatar billede chries Nybegynder
24. maj 2002 - 13:03 #6
ak, så virker mit kode ikke .
Avatar billede chries Nybegynder
24. maj 2002 - 13:08 #7
void remove( int size, char input[], char output[] )
{
    int j = 0;

    for( int i=0; i < size; i++ )
    {
        if( input[i] != '\0' )
        {
            output[j] = input[i];
            j++;
        }
    }

    output[j] = '\0';
}
Avatar billede laffe Nybegynder
24. maj 2002 - 13:09 #8
char Dst[200];
char Src[200];

memset(Dst,0,200); // nulstil Dst, for at beholde en nullterminering

strip(Dst,Src,200);
Avatar billede frostholm Praktikant
24. maj 2002 - 14:26 #9
Tak for svarene, men jeg har prøvet at putte dem ind i mit pgm, men jeg er bare endt op mere forvirrende.

Kort fortalt har jeg en struct, bestående af en masse nulterminerede strenge.

Det er denne struct jeg skal levere videre som en streng med kun en terminering.

Jeg havde en ide :'

memcpy(Src,retopl,sizeof(retopl));
memset(Dst,0,16000)  (længden på min Src)
strip(Dst,Src,16000) (hvis jeg bruger laffes eksempel)

Men det virker ikke ;.) jeg får en tom streng hvis jeg prøver :

printf("\nStreng %s",Dst);

Hvad gør jeg galt ?
Avatar billede laffe Nybegynder
24. maj 2002 - 14:44 #10
Er Dst 16000 bytes lang ?
Avatar billede laffe Nybegynder
24. maj 2002 - 14:51 #11
Hvis du har en buffer der indeholder følgende:

'h' 'e' 'j' '\0' 'm' 'e' 'd' '\0' 'd' 'i' 'g' '\0'

Når alle '\0' er fjernet, foruden det sidste, så skal bufferen se sådan ud:
'h' 'e' 'j' 'm' 'e' 'd' 'd' 'i' 'g' '\0'

Er det korrekt ?
Avatar billede frostholm Praktikant
24. maj 2002 - 15:03 #12
Ja laffe det er korrekt her er mine data :

jeg har en fubktion der ser sådanne ud :

int kald_kob(char in[], char ud[])
{
  char Src [16000];
  memcpy(Src,&retopl,sizeof(retopl));
  memset(ud,0,16000); 
  strip_nul(ud,Src,16000);
  printf("\nStreng %s",ud);
}


void strip_nul(char* Dst, char* Src, int srcLen)
{
  char* d;
  char* s;

  s = Src;
  d = Dst;
  for (int i=0; i<srcLen; i++)
  {
    if (*s != 0)
    {
      *d = *s;
      d++;
    }
    s++;
  }
}

globale variable er :

                struct inputoplysninger
        {
          char kundenummer            [11];
          char brugernavn            [9];
          char kendeord                [9];
          char user_id              [11];
          char sprog                [4];
          char versionsnr            [5];
          char service                [9];
          char nummer_type            [4];
          char nummer                [11];
            char navn                    [36];
          char adresse                [36];
          char post_nummer            [5];
          char kommunikations_type    [4];
          char kommunikations_nummer[71];
          char personnavn            [36];
          char medtag_ikke_aktive    [2];
          char medtag_filialer        [2];
          char max_antal            [3];
          char startkey                [56];
          char kobnummer            [11];
        };
               
        struct ratioplysninger
        {
          char rating_dato          [11];
          char rating_kode            [4];   
          char rating_tekst        [51];
          char risikogruppe_kode    [4];
          char risikogruppe_tekst    [51];
          char kreditmaximum_valuta [4];
          char kreditmaximum        [21];
        };
               
               
        struct firmaopl{
          char kob_nummer    [11];
            char cvr_nummer    [11];
          char jur_form_kode  [4];
            char status_kode      [4];   
            char navn              [71];
            char adresse          [36];
          char post_nummer    [5];
            char post_distrikt  [36];
            char telefon_nummer [26];
            char soege_hit      [71];
          char soege_hit_type [4];
        };

       
        struct returoplysninger
        {
            struct firmaopl firma[50];
            struct ratioplysninger rati;
            char startkey        [56];
            char user_id        [11];
            char rec_antal      [3];
            char kob_mess_level  [2];
            char kob_mess_number [5];
            char kob_mess_descri [31];   
        };

        struct returoplysninger retopl;
        struct inputoplysninger mininput;

Dvs jeg kalder min fubktion med en buffer[1600], funktionen ligger værdier fra bufferen over i en struct, så kalder programmet en xlm combonent, som returnere nogle data, som jeg ligger i min retopl struktur.

Det er denne struktur som jeg skal levere tilbage som ud[]

Håber det hjælper, ellers vil jeg gerne maile src
Avatar billede laffe Nybegynder
24. maj 2002 - 15:20 #13
Jeg tror dit problem ligger et andet sted.

Når du kopierer din struct over i en char buffer, så bliver ALLE tegn jo kopieret over.
  1. De 'valide' ascii tegn
  2. dine null termineringer
  3. samt alle resterende byes, som ikke bruges.

Lad os f.eks tage nedenstående felter.
 
char kundenummer    [11];
char brugernavn    [9];

kundenummer = "1200"
brugernavn = "laffe"

I kundenummer bruges der jo kun 5 bytes. 4 til nummeret og 1 til '\0'. Hvad med de resterende 6 bytes i bufferen.

Hvad ståre der i dem ?

De bliver jo også kopieret med over, og lagt ind i den ene lange streng (OutBuffer) som du vil ende med.

F.eks:

OutBuffer=1200??????laffe????

ved ? ved vi ikke hvad der kan stå. Det vil være tilfældig.

Mit forslag er at kopiere alle felter enkelt/strenge over i den lange streng en ad gangen. Så har du helt styr på, hvad der kommer med.

Du kan gøre det med : strcat funktionen
Avatar billede frostholm Praktikant
24. maj 2002 - 15:24 #14
takker, det vil jeg gøre, håbede bare der var en nemmere måde.

tak for hjælpen alle sammen
Avatar billede frostholm Praktikant
24. maj 2002 - 15:44 #15
Hvis jeg gør det på den måde bliver resultatet så ikke :

char kundenummer    [11];
char brugernavn    [9];

kundenummer = "1200"
brugernavn = "laffe"

strcat(outbuffer,kundenummer);
strcat(outbuffer,brugernavn);


så bliver det vel
OutBuffer=1200laffe

og ikke
OutBuffer=1200          laffe

Jeg har lavet felterne 1 større en de skal dvs 11 i stedet for 10 osv, da der skulle være plads til en nulterminator, men nå jeg skal returnere dem, skal de returneres som 10, 8 osv om med opfyldning af blanke.

Mvh
Michael F
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