[C] String doorgeven aan functie en bewerken

Pagina: 1
Acties:

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-07 21:46

Confusion

Fallen from grace

Topicstarter
Ik ben een beetje door Kernighan en Ritchie aan het werken en kom daar de opdracht tegen een functie 'squeeze' te schrijven die alle karakters uit het tweede argument verwijdert uit de string in het eerste argument. Mijn poging:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
void squeeze(char s1[], char s2[]) {
  int i, j, k;
  for( i = 0; s2[i] != '\0'; i++ )
  {
    for ( j = k = 0; s1[j] != '\0'; j++ )
    {
      if ( s1[j] != s2[i] )
      {
        s1[k++] = s1[j];
      }
    }
    s1[k] = '\0';
  }
  printf("%s",s1);
  return;
}

int main() {
  squeeze("ali baba and the 40 bandits", "ab ");
  return 0;
}


Helaas, dit heeft een segmentation fault. Nu zoek ik me al een tijdje suf, heb ook een werkende oplossing voor dit probleem gevonden, maar ik kan mijn vinger niet op het probleem leggen. De goede oplossing bewerkt ook de doorgegeven 'string', de indices worden niet negatief (ik heb er al hordes printfs tussen gehad om de waarden te controleren) en toch wordt er dus blijkbaar toegang tot geheugen gepoogd dat niet van mij is, op de regel s1[k++] = s1[j]. Wat is er mis met deze toekenning en waarom mag vrijwel hetzelfde wel in het voorbeeld?

Wie trösten wir uns, die Mörder aller Mörder?


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Probeer eens te debuggen. Zet eens wat breakpoints, stap door de code en schrijf eens wat logmeldingen op het scherm. Dan moet je er vast uitkomen.

We adore chaos because we like to restore order - M.C. Escher


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-07 21:46

Confusion

Fallen from grace

Topicstarter
Met gdb erdoorheen steppen gaf geen enkele fout, dat is het rare. De string werd netjes aangepast gedurende de verschillende doorlopen en ook de printf deed zijn werk. Alleen als ik hem 'gewoon' run, dan loopt hij tot i=0, j=1, k=0, waarbij s1[j] dus ongelijk is aan s2[i] (de l van ali is ongelijk aan de a van "ab ") en dan gaat het mis op voornoemde regel.

Wie trösten wir uns, die Mörder aller Mörder?


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Strings in de vorm van "bladiebla" zijn standaard constantes en die hoor je niet te wijzigen (bij veel compilers worden ze ook in het readonly gedeelte van je programma gezet uiteindelijk en dat is wat de crash veroorzaakt). Probeer het eens met:
C:
1
2
char bla[] = "ali baba and the 40 bandits";
squeeze(bla, "ab ");

www.madwizard.org


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-07 21:46

Confusion

Fallen from grace

Topicstarter
Dus toch een string literal probleem. Ik was door het lange zoeken een beetje mistig geworden en dacht dat in het gevonden voorbeeld ook direct een string literal werd meegegeven. Ik was gewoon niet meer zeker hoe het nu zat door het lange zoeken. Bedankt!

Wie trösten wir uns, die Mörder aller Mörder?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

het is trouwens wel zo netjes om s2 als const te declareren. Je past hem immers niet aan, en met die const krijg je ook compile errors als je het wel doet (tenzij je de const wegcast natuurlijk, maar dat terzijde)

Bovendien kun je dan ook const strings meegeven als 2e argument, iets wat nu niet kan :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1