Nieuws:

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

Auteur Topic: [C++] Char array: hoe inhoud aanpassen?  (gelezen 6587 keer)

Offline Joshua822

  • Lid
[C++] Char array: hoe inhoud aanpassen?
« Gepost op: 2009/09/24, 20:18:37 »
Hallo allemaal.

Ten eerste, wil ik zeggen dat ik weet dat ik hetzelfde kinderlijk eenvoudig met het string headerbestand kan doen. Maar dit gaat gewoon om het leren: niets praktisch dus.

Stel dat ik de volgende C++ statements heb:

char woord [ 10 ] = "Hello!";
woord = "Goodbye!";

Dit compileert niet. Maar eigenlijk zou ik willen weten waarom dit niet compileert en hoe ik toch een andere tekenreeks in de array woord kan opslaan.

Alvast bedankt.


Offline Typhoner

  • Lid
    • http://typhoner.blogspot.com/
Re: [C++] Char array: hoe inhoud aanpassen?
« Reactie #1 Gepost op: 2009/09/24, 20:37:49 »
In C(++) kan je strings niet kopiëren of optellen met = of +. In de header string.h staan functies hiervoor. Voor kopiëren van strings is dat strcpy().

Dus boven:

#include <string.h>
en dan als in jouw voorbeeld:

char woord[10];
strcpy(woord, "Hello");
strcpy(woord, "Goodbye!");

dit is equivalent aan jouw idee, natuurlijk heb je wel een main() functie nodig en zo :D

Offline Typhoner

  • Lid
    • http://typhoner.blogspot.com/
Re: [C++] Char array: hoe inhoud aanpassen?
« Reactie #2 Gepost op: 2009/09/24, 20:46:12 »
Dat kan niet omdat string geen datatype van C++ is. De operators (+, =, ...) kunnen er dus ook niet mee om.

Je kan wel een eigen klasse schrijven, waar je een datatype definieert, en operatoren overload.

Er is dus wel een klasse beschikbaar waar dit mee kan.

Offline Joshua822

  • Lid
Re: [C++] Char array: hoe inhoud aanpassen?
« Reactie #3 Gepost op: 2009/09/24, 20:53:43 »
Oké, dat is nog een manier. Maar eigenlijk zoek ik een manier om het zonder header files te doen.

Offline Typhoner

  • Lid
    • http://typhoner.blogspot.com/
Re: [C++] Char array: hoe inhoud aanpassen?
« Reactie #4 Gepost op: 2009/09/24, 21:02:30 »
een functie schrijven waarmee je een tekst char voor char in een array plaatst?

Offline Joshua822

  • Lid
Re: [C++] Char array: hoe inhoud aanpassen?
« Reactie #5 Gepost op: 2009/09/24, 21:16:15 »
En weet je toevallig ook hoe ik daaraan moet beginnen?

Vooral: welk type variabel moet ik vragen in mijn functie prototype voor de tekenreeks die de oude vervangt?

Offline idefix

  • Lid
Re: [C++] Char array: hoe inhoud aanpassen?
« Reactie #6 Gepost op: 2009/09/24, 22:21:39 »
En weet je toevallig ook hoe ik daaraan moet beginnen?

Vooral: welk type variabel moet ik vragen in mijn functie prototype voor de tekenreeks die de oude vervangt?

prototype:

char * vervang(const char * p);

Dit is een functie die een pointer naar char levert en als argument een const pointer naar char neemt.
Support bacteria. They're the only culture some people have.

Offline Joshua822

  • Lid
Re: [C++] Char array: hoe inhoud aanpassen?
« Reactie #7 Gepost op: 2009/09/25, 16:50:26 »
Oké, bedankt voor de hulp allemaal!

Hier is de code die ik gebruikt heb:
#include <iostream>

using namespace std;

void vervang ( int l, const char * new_string, char * dest );

int main ()
{
    char woord [ 9 ] = "Hallo!";
    cout << woord << endl;
    vervang ( 9, "Goodbye!", woord );
    cout << woord << endl;
    cin.get ();
    return 0;
}

void vervang ( int l, const char * new_string, char * dest )
{
     int x, n;
     for ( n = 0; n < l; n++ )
     {
         dest [ n ] = new_string [ n ];
     }
     x = n--;
     dest [ x ] = '\0';
}

Nu heb ik wel nog een vraag: is het echt nodig om de twee laatste regels van de functie "vervang" uittevoeren? Of wordt het '\0' karakter automatisch toegevoegd?

Re: [C++] Char array: hoe inhoud aanpassen?
« Reactie #8 Gepost op: 2009/09/25, 18:16:48 »
namespace NIH?

Oh, en er zijn betere manieren om dat te doen...
#define mystrcpy(a,b) __builtin_strcpy(a,b)
Werkt alleen maar met GCC. Ik zou hier ook nog een volledig geoptimaliseerde asm strcpy kunnen zetten, met duff's device en zo.... Hmm, eens strlen proberen...
int strlen(const char* buf) {
    __asm__ {
        pop %edx
        xor %ecx
        lloop:    
            mov [%edx+%ecx],%eax
            jz lret
            inc %ecx
            jmp lloop
        lret:
            mov %ecx,%eax
            ret
    }
}
« Laatst bewerkt op: 2009/09/25, 18:18:24 door SeySayux »
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline idefix

  • Lid
Re: [C++] Char array: hoe inhoud aanpassen?
« Reactie #9 Gepost op: 2009/09/25, 18:19:41 »
Hallo Joshua, jouw code geeft toch een segmentation fault?
Je moet er eens ter controle volgende regels tussen zetten:

void vervang ( int l, const char * new_string, char * dest )
{
     int x,n;
     for ( n = 0; n < l; n++ )
     {
         dest [ n ] = new_string [ n ];
     }
 [b]    cout << endl << n << endl;[/b]
    x = n--;
 [b]    cout << endl << x << endl;[/b]
     dest [x] = '\0';
}

Dan zie je wat de waarden van n en x zijn: 9 en 9
Dit wil zeggen dat je een waarde gaat schrijven in het tiende element van een array dat maar 9 elementen bevat. Hiermee overschrijdt je de grenzen van je array. En dat moet je ten alle prijze vermijden.

De boosdoener is hier de volgende lijn (het is heel subtiel, hoor):

x = n--;
Deze code kent aan x de waarde van n toe, en PAS NADIEN wordt de waarde van n verminderd met 1. Dit komt omdat de -- NA de n staat. (dat heet postfix positie van de --operator)
De volgende code trekt eerst één af van n en kent die waarde toe aan x (prefix positie):

x = --n;
Maar om op je vraag te antwoorden: die twee laatste regels zijn volgens mij wel degelijk nodig. Maar als ik ze weglaat, compileert mijn programma zonder protest van gcc en komt er ook geen fout bij de uitvoering. Dus dat is voor mij ook een raadsel. Iemand anders die er meer van weet?





Support bacteria. They're the only culture some people have.

Re: [C++] Char array: hoe inhoud aanpassen?
« Reactie #10 Gepost op: 2009/09/25, 18:24:29 »
Dat je niet akkoord gaat met sommige dingen uit de stl, okee, maar strlen opnieuw willen implementeren omdat je geen header wilt lncluden? WTF? Straks ga je operator/ voor doubles ook nog zelf herdefiniëren! Oh wacht, doe de optelling voor integers opnieuw!
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline Joshua822

  • Lid
Re: [C++] Char array: hoe inhoud aanpassen?
« Reactie #11 Gepost op: 2009/09/25, 18:40:18 »
Bij mij compileert en werkt het programma foutloos. Alhoewel ik er bij moet zeggen dat ik momenteel Windows XP gebruik.

Trouwens, inderdaad, maar het is niet noodzakelijk om bij de variabel n één af te trekken. Daarom heb ik het nog wat aangepast. Dit is dus ideaal:
#include <iostream>

using namespace std;

void vervang ( int l, const char * new_string, char * dest );

int main ()
{
    char woord [ 9 ] = "Hallo!";
    cout << woord << endl;
    vervang ( 9, "Goodbye!", woord );
    cout << woord << endl;
    cin.get ();
    return 0;
}

void vervang ( int l, const char * new_string, char * dest )
{
     int x, n;
     for ( n = 0; n < l; n++ )
         dest [ n ] = new_string [ n ];
     x = n - 1;
     dest [ x ] = '\0';
}

Citaat
Dat je niet akkoord gaat met sommige dingen uit de stl, okee, maar strlen opnieuw willen implementeren omdat je geen header wilt lncluden? WTF? Straks ga je operator/ voor doubles ook nog zelf herdefiniëren! Oh wacht, doe de optelling voor integers opnieuw!

Ik heb niets tegen headers. Ik wil gewoon leren hoe je het ook zelf kunt doen. Als ik echt iets serieus maak zal ik heus de "string" bibliotheek gebruiken.

Offline Joshua822

  • Lid
Re: [C++] Char array: hoe inhoud aanpassen?
« Reactie #12 Gepost op: 2009/09/25, 18:54:36 »
Trouwens, ik heb het net geprobeerd. De variabel x is zoals ik vermoedde helemaal niet nodig!

Dat komt door de expressie n < l in de For lus. Het getal kan helemaal nooit evenveel als l worden, maar alleen één minder dan l.

Dit is dus de uiteindelijke code:
#include <iostream>

using namespace std;

void vervang ( int l, const char * new_string, char * dest );

int main ()
{
    char woord [ 9 ] = "Hallo!";
    cout << woord << endl;
    vervang ( 9, "Goodbye!", woord );
    cout << woord << endl;
    vervang ( 9, "Hond", woord );
    cout << woord << endl;
    cin.get ();
    return 0;
}

void vervang ( int l, const char * new_string, char * dest )
{
     int n;
     for ( n = 0; n < l; n++ )
         dest [ n ] = new_string [ n ];
     dest [ n ] = '\0';
}

Offline idefix

  • Lid
Re: [C++] Char array: hoe inhoud aanpassen?
« Reactie #13 Gepost op: 2009/09/25, 20:19:01 »
Ik heb niets tegen headers. Ik wil gewoon leren hoe je het ook zelf kunt doen. Als ik echt iets serieus maak zal ik heus de "string" bibliotheek gebruiken.

Groot gelijk heb je! In mijn boek over C (van Kelley en Pohl) staan ook voorbeelden hoe strcat() en strlen() geïmplementeerd zouden kunnen worden.

Of om in de wereld van SeySayux te blijven: in het boek van Ivor Horton (Beginning Java) geeft hij als voorbeeld van OOP hoe je linked lists kunt maken. Ettelijke bladzijden worden hieraan gewijd, dit toch wel gecompliceerde onderwerp wordt van naaldje tot draadje uit de doeken gedaan om dan te concluderen dat er een ingebouwd type LinkedList bestaat. Maar de oefening om het eens zelf te maken was interessant.
Support bacteria. They're the only culture some people have.

Offline Joshua822

  • Lid
Re: [C++] Char array: hoe inhoud aanpassen?
« Reactie #14 Gepost op: 2009/09/25, 20:45:20 »
Ja, inderdaad, idefix. Dat is ook wat programmeren zo leuk maakt: je krijgt een probleem, en je probeert er een oplossing voor te bedenken en te schrijven. Als er voor elk probleem al een functie was zou het gewoonweg niet meer leuk zijn, omdat de uitdaging weg is.

Trouwens, de lengte van een tekenreeks is niet moeilijk. Deze functie heb ik net even in een menuutje geschreven:
#include <iostream>

using namespace std;

int strlen_alt ( char * string );

int main ()
{
    int lengte ( 0 );
    char tekenreeks [ 7 ] = "Hallo!";
    lengte = strlen_alt ( tekenreeks );
    cout << lengte << endl;
    cin.get ();
    return 0;
}

int strlen_alt ( char * string )
{
    int a ( 0 );
    while ( string[a] != '\0')
          a++;
    return a;
}
Dit werkt vlekkeloos.

Re: [C++] Char array: hoe inhoud aanpassen?
« Reactie #15 Gepost op: 2009/09/26, 12:00:24 »
strlen:
int strlen(const char* buf) {
    unsigned len = 0;
    while(buf[len] != 0;) len++;
    return len;
}
strcpy:
void strcpy(char* dest, const char* src) {
     for(int i = 0; i < strlen(to); ++i) dest[i] = src[i];
}
Dit is ongeveer zowat de meest optimale versie die je in C kan schrijven van beiden. Maar meestal worden ze in asm geschreven...
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net