Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [C] Probleem met functie die string aanneemt  (gelezen 1229 keer)

Offline Joshua822

  • Documentatieteam
  • Steunpunt: Nee
[C] Probleem met functie die string aanneemt
« Gepost op: 2009/08/31, 11:14:05 »
Hallo allemaal.

Ik probeer een functie te schrijven die een string ( met het type char * ) aanneemt. Deze functie dient om een string met lower case tekens om te zetten in een string met upper case tekens ( ja, ik weet dat de headerfile string.h hier eigenlijk al een functie voor bevat[/b] ).

Dit is de code:

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

void str_ltu( char * lstring )
{
  int i, len;
  len = strlen( lstring );
  for ( i = 0; i < len; i++ )
    lstring[i] += 32;
  printf( lstring );
}

int main()
{
  char * string = "abc";
  str_ltu( string );
  return 0;
}

Opmerking: ik geef de string in upper case tekens nog niet terug, dit is de bedoeling.

Nu is het probleem dat ik telkens een segmentatiefout krijg.

Waar zit de fout ?

Alvast bedankt.

Offline profoX

  • Lid
    • wesley
    • Lionslink
  • Steunpunt: Nee
Re: [C] Probleem met functie die string aanneemt
« Reactie #1 Gepost op: 2009/08/31, 11:30:57 »
Als je een string zoals daar declareert dan declareer je die eigenlijk in het geheugen als const data, en dus kan je die string niet aanpassen (immutable).
Zo kan het bv. wel:

char string[4] = "abc"; /* 3 voor abc + 1 voor null character */

ook moet je lstring -= 32 doen ipv +=
« Laatst bewerkt op: 2009/08/31, 11:36:00 door profoX »
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline Joshua822

  • Documentatieteam
  • Steunpunt: Nee
Re: [C] Probleem met functie die string aanneemt
« Reactie #2 Gepost op: 2009/08/31, 11:35:32 »
Maar dan heb ik wel het probleem dat ik niet weet hoe groot de string is. En ik zou ook liever zonder deze informatie te weten kunnen werken.

Dus is het mogelijk om te zorgen dat een string een dynamische grootte heeft ?

Offline profoX

  • Lid
    • wesley
    • Lionslink
  • Steunpunt: Nee
Re: [C] Probleem met functie die string aanneemt
« Reactie #3 Gepost op: 2009/08/31, 11:40:19 »
Dit is een voorbeeld van hoe het kan door dynamisch te alloceren:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *str_ltu( char * lstring )
{
  int i, len;
  char *str;
  len = strlen( lstring );
  str = (char*)malloc(len + 1);
  for ( i = 0; i < len; i++ )
    str[i] = lstring[i] - 32;
  return str;
}

int main()
{
  char *string = str_ltu("abc");
  printf( "%s\n", string );
  free(string);
  return 0;
}
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline Joshua822

  • Documentatieteam
  • Steunpunt: Nee
Re: [C] Probleem met functie die string aanneemt
« Reactie #4 Gepost op: 2009/08/31, 12:24:32 »
't Is gelukt. Hier is de code:

/* Functie voor het converteren van lower case strings naar upper case strings */
/* Deze functie heet str_ltu ( STRing Lower case To Upper case ) */
/* In main() wordt deze functie alleen getest */
/* Deze functie en de implementatie hebben de header files <string.h> en */
/* <stdlib.h> nodig. */
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* lstring is de eerste string, in lower case */
char * str_ltu( char *lstring )
{
  /* Variabelen voor de indicator van de lus, en de lengte van lstring */
  int i, len;
  /* De geconverteerde string in upper case */
  char * ustring;   
  len = strlen( lstring );
  ustring = ( char* )malloc( len + 1 );
  for ( i = 0; i < len; i++ )
    if( lstring[i] >= 97 )
      ustring[i] = lstring[i] - 32;
    else
      ustring[i] = lstring[i];
  return ustring;
}

int main()
{
  /* str is de string om str_ltu() te testen */
  char * str = str_ltu( "aBcDeF" );
  printf( "%s \n", str );
  free( str );
  return 0;
}
Dit werkt uitstekend !

Offline SeySayux

  • Lid
    • SeySayux.net
  • Steunpunt: Nee
Re: [C] Probleem met functie die string aanneemt
« Reactie #5 Gepost op: 2009/08/31, 12:37:39 »
Dit lijkt niet met UTF-8 strings te werken ???

:P ;)
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline Joshua822

  • Documentatieteam
  • Steunpunt: Nee
Re: [C] Probleem met functie die string aanneemt
« Reactie #6 Gepost op: 2009/08/31, 13:11:03 »
Ja, daar heb je gelijk in. Het is gewoon voorzien om met ASCII waarden tussen 65 en 129 te werken. Maar als je wilt kan ik het implementeren  :P

Offline SeySayux

  • Lid
    • SeySayux.net
  • Steunpunt: Nee
Re: [C] Probleem met functie die string aanneemt
« Reactie #7 Gepost op: 2009/08/31, 15:04:25 »
Citaat
/* Functie voor het converteren van lower case strings naar upper case strings */
/* Deze functie heet str_ltu ( STRing Lower case To Upper case ) */
/* In main() wordt deze functie alleen getest */
/* Deze functie en de implementatie hebben de header files <string.h>,*/
/* <stdlib.h> en <Sylph/Core/String.h> nodig. */
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Sylph/Core/String.h>

/* lstring is de eerste string, in lower case */
char * str_ltu( const char *lstring )
{
  return Sylph::String(lstring)&uc;
}

int main()
{
  /* str is de string om str_ltu() te testen */
  char * str = str_ltu( "aBcDeF" );
  printf( "%s \n", str );
  free( str );
  return 0;
}

Been there, done that. :P
« Laatst bewerkt op: 2009/08/31, 15:11:50 door SeySayux »
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net