Unterschiedlich lange char Arrays kopieren



  • Hallo zusammen

    Ich habe folgenden char Array mit beliebigem Inhalt (also keine nullterminierten Strings):

    char a[6] = {1, 43, 123, 0, 211, 198};
    

    Ich möchte daraus einen char Array b der Länge 10 machen (die zusätzlichen Elemente einfach mit Nullen füllen), sodass b dann wie folgt aussieht:

    {1, 43, 123, 0, 211, 198, 0, 0, 0, 0}

    Dummerweise funktioniert

    char b[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    strcpy(b, a);
    

    nicht, da strcpy den Array a als nullterminierten String interpretiert und bei der Null (Element 3) abbricht. Bei strncpy, strcat und strncat dasselbe Problem.

    Auch diese Versuche schlugen fehl:

    char b[10] = a;
    
    char b[10] = {a, {0, 0, 0, 0}};
    

    Ok, dann fülle ich halt die hinteren vier Elemente mit einer for-Schleife auf, das ist ja nicht so tragisch. Aber wie kriege ich Array a in die ersten 6 Elemente von b? Muss ich das auch per Schleife tun oder gibt es eine elegantere Lösung?



  • Zum Beispiel mit einer for schleife.

    int SizeA=6;
    int SizeB=10;
    
    for (int i=0; i<SizeB; i++)
    {
    	if (i<SizeA) ArrayB[i]=ArrayA[i];
    	else ArrayB=0;
    }
    


  • Meine erste Idee wäre:

    memcpy(b, a, sizeof(a));
    


  • lol...ja, das ist natürlich besser 😃



  • Aah, genau so was habe ich gesucht. Danke!

    So, jetzt wird's schwieriger 🙂 :

    Ich hätte gerne eine Funktion ("fillup"), die einen neuen Array gewählter Grösse sozusagen direkt bei dessen Definition initialisiert und mit Nullen/Einsen oder so füllt:

    char *a[100] = fillup(a, 0);
    

    fillup müsste also den Array a[100] mit Nullen auffüllen und dann die Adresse von a zurückgeben. Das Ganze müsste natürlich auch mit Arrays anderer Länge funktionieren.

    Ist so was theoretisch überhaupt machbar?

    Die Funktion müsste irgendwie so aussehen:

    char [sizeof(a)] fillup(char *array, char value)
    {
        for(int i = 0; i < sizeof(array); i++)
            array[i] = value;
        return &array;
    }
    


  • Praetorian schrieb:

    Ist so was theoretisch überhaupt machbar?

    In c++? UNmöglich! *g*

    Was du suchst in memset.



  • Hm, ich sollte wohl mal http://www.cplusplus.com/ref genau studieren... 🙄

    Damit geht's, aber leider nur auf zwei Zeilen:

    char a[100];
    memset(a, 0, 100);
    

    Geht das nicht irgendwie auf einer?



  • hä?
    Ist doch egal, ob du zwei oder eine Zeile code hast.
    Du kannst das evtl. in einer struct machen und dann per Konstruktor initialisieren.

    struct Array
    {
    	Array () { memset (a, 0, 100) }
    	a[100];
    };
    

    Edit: memset ist aber schneller.



  • Ich wollte eigentlich Zweizeiler vermeiden weil ich das ganze zigmal hintereinander aufrufen muss und das auch noch immer wieder anders ohne wirkliche Regelmässigkeit, und das Ganze nicht zu Lasten der Codeübersicht und -lesbarkeit gehen sollte. Aber ich denke ich kann doch ganz gut damit leben. Danke für deine Hilfe!



  • Ich wollte eigentlich Zweizeiler vermeiden weil ich das ganze zigmal hintereinander aufrufen muss und das auch noch immer wieder anders ohne wirkliche Regelmässigkeit, und das Ganze nicht zu Lasten der Codeübersicht und -lesbarkeit gehen sollte. Aber ich denke ich kann doch ganz gut damit leben. Danke für deine Hilfe!



  • Ein Einzeiler könnte zB so aussehen

    char a[100] = {0};
    


  • Und dann füllt er das Teil mit Nullen? Muss ich gleich mal ausprobieren!



  • Wie wär's mit einem

    std::vector<char> a(size, defaultvalue);
    

    ?

    MfG Jester



  • Also

    char a[100] = {0};
    

    füllt den Array nicht.

    std::vector<char> a(100, 0);
    

    funktioniert zwar, aber wenn ich dann a per fwrite streamen will

    std::vector<char> a(100, 0);
    FILE *out = fopen("C:\\out.txt", "wb");
    fwrite(a, 1, 100, out);
    

    sagt Visual Studio:
    cannot convert from 'class std::vector<char,class std::allocator<char> >' to 'char'
    No user-defined-conversion operator avaliable that can perform this conversion, or the operator cannot be called



  • dann versuch's mal mit &a[0] statt a ander Stelle. Aber für sowas würd ich Dir std::string und streams empfehlen. Damit geht sowas ganz einfach.

    MfG Jester



  • Praetorian schrieb:

    Also

    char a[100] = {0};
    

    füllt den Array nicht.

    Laut Standard sollte es das aber, nennt sich zero-initialization. Der GCC und MSC macht das auch problemlos. Welchen Compiler hast du denn?



  • groovemaster schrieb:

    Praetorian schrieb:

    Also

    char a[100] = {0};
    

    füllt den Array nicht.

    Laut Standard sollte es das aber, nennt sich zero-initialization. Der GCC und MSC macht das auch problemlos. Welchen Compiler hast du denn?

    sagt Visual Studio

    Ich würde auf VC 6.0 tippen 😉



  • Also _mein_ VC 6 kann das :).



  • HumeSikkins schrieb:

    Ich würde auf VC 6.0 tippen 😉

    VC 6 ist aber kein Compiler, höchstens 'ne IDE. :p
    Ne, mal im ernst. Ist zwar schon 'ne Weile her, dass ich den MSC 6 benutzt hab und IIRC konnte der das.



  • Ja, es ist Visual Studio 6.0 ( 😉 ). Stimmt, mit Nullen gehts tatsächlich. Aber gibt es auch zB eine five-initialization? Ich brauche das nämlich für beliebige Werte.



  • afaik geht sowas nur mit null, für beliebige Werte musst du dann schon eine der bereits genannten Lösungsvorschläge benutzen. Und wenn du sowas wie std::vector nicht nehmen willst (für nichtdynamische Arrays wärs dann boost::array), würde ich std::memset nehmen (doch Vorsicht, std::memset arbeitet byteweise und nicht elementweise). Oder du schaust dir mal std::fill an.


Anmelden zum Antworten