String zusammenfügen



  • Eichhorn schrieb:

    char test2[10]={0,9,8,7,6,5,4,3,2,1};
    

    Öhmm,
    Dieser String ist leer, wolltest Du das 😕 Ein String wird mit dem Wert 0 bzw. '\0' terminiert, heißt, ist seine Ende- Kennung; was Du dahinter schreibst, ist egal (naja, solange der Speicher dafür reserviert ist).
    Zwei Strings zu einem hängst Du mit strcat() zusammen. http://www.cplusplus.com/reference/clibrary/cstring/strcat.html



  • feigling schrieb:

    Ich würde snprintf nehmen.

    wäre wohl zu empfehlen, oder vielleicht strncat.

    pointercrash() schrieb:

    Ein String wird mit dem Wert 0 bzw. '\0' terminiert, heißt, ist seine Ende- Kennung;

    mit dem \0 gehe ich auch mit, aber bei einer normalen 0? was macht da den unterschied zu

    char *a = "die0";
    

    müsste es dann '0' bei der initialisierung von eichhorn sein?



  • \0 != '0' , da \0 == 0 und laut dem ASCII Code '0' == 48 != 0



  • hando schrieb:

    feigling schrieb:

    Ich würde snprintf nehmen.

    wäre wohl zu empfehlen, oder vielleicht strncat.

    Gut, strncat hat den Vorteil, daß man die Ziellänge vorgeben kann. Von dem printf- Kram würde ich die Finger lassen, wenn man nicht dessen Fähigkeiten zur Formatierung und Umwandlung braucht, weil er urlahm ist. Beim schlichten Zusammenziehen ist strcat bzw. strncat viel, viel schneller.

    hando schrieb:

    mit dem \0 gehe ich auch mit, aber bei einer normalen 0? was macht da den unterschied zu

    char *a = "die0";
    

    müsste es dann '0' bei der initialisierung von eichhorn sein?

    Wahrscheinlich war's so gedacht:

    char test2[11]={'0','9','8','7','6','5','4','3','2','1',0};
    

    und ist völlig gleichbedeutend mit:

    char test2[11]={'0','9','8','7','6','5','4','3','2','1','\0'};
    

    😃



  • ^^ nehmt doch 'ne stringkonstante: char *my_string = "1234567890";
    oder hat das schon wer gesagt?
    🙂



  • pointercrash() schrieb:

    Wahrscheinlich war's so gedacht:

    char test2[11]={'0','9','8','7','6','5','4','3','2','1',0};
    

    und ist völlig gleichbedeutend mit:

    char test2[11]={'0','9','8','7','6','5','4','3','2','1','\0'};
    

    😃

    alles klar 🙂

    +fricky schrieb:

    ^^ nehmt doch 'ne stringkonstante: char *my_string = "1234567890";
    oder hat das schon wer gesagt?

    glaub nicht in dem sinne, ist aber wohl das einfachste 🙂



  • Hallo
    Danke für eure Hilfe 🙂
    Hat mir sehr geholfen. Vorallem das mit der \0 Ende-Kennung. War mir bisher nicht bekannt 😃
    Habe es nun folgendermaßen lösen können.

    char i = 10;
    char ime=9;
    char test1[11]={'1','2','3','4','5','6','7','8','9','0','\0'};
    char test2[11]={'0','9','8','7','6','5','4','3','2','1','\0'};
    char endstring[100]="\0";  //Groß genug zur sicherheit
    char tmp1[100]="\0";
    char tmp2[100]="\0";
    
    while(i--)
    {
    itoa((test1[abs(ime-i)]-48),tmp,10);
    strcat(tmp, ";");
    itoa((test2[abs(ime-i)]-48),tmp2,10);
    strcat(tmp,tmp2);
    strcat(tmp,"\r\n");
    strcat(endstring,tmp);
    }
    

    Leider hat sich durch dies das Problem wenn ich anstatt Zahlen Buchstaben in den test arrays ablege, nur der entsrpechende Ascii Wert erhalte.

    Liegt dies an itoa??
    Und gibt es evtl eine Funkion die das verhindert bzw den Wert wieder zu einem Buchstaben macht?

    Gruß
    Eichhorn



  • Eichhorn schrieb:

    Liegt dies an itoa??

    Schon, aber ich täte mir leichter, wenn Du erstmal erklärst, was Du letztendlich vor hast, sprich, was Dein Progrämmchen tun soll. Entweder machst Du Dir das Leben zu kompliziert oder zu einfach, aber da bin ich mir noch nicht sicher ... 😕



  • Nun gut.
    Ich habe

    char test1[11]={'1','2','3','4','5','6','7','8','9','0','\0'};
    

    hier sollen schlussendlich, nachdem es mit testwerten funktioniert hat, zeitwerte stehen. Am besten von einem RTC, abr evtl auch nur durch eine Routine vom µC berechnet das gneauigkeit auf 15min +- genügt.
    Zusätzlich habe ich

    char test2[11]={'0','9','8','7','6','5','4','3','2','1','\0'};
    

    Hier sollen in Zukunft Messdaten stehen, die zu den jeweiligen Zeiten in test1 aufgenommen wurden.

    Außerdem habe ich noch

    char endstring[100]="\0";
    

    hier soll ganz am ende der string stehen, welcher, wenn ich ihn am PC abspeicher als CSV-Datei geöffnet und betrachtet werden kann. Deshalb muss zwischen test1 und test2 ein ; hin

    itoa((test1[abs(ime-i)]-48),tmp,10);
    strcat(tmp, ";");
    itoa((test2[abs(ime-i)]-48),tmp2,10);
    

    und nach test2 kommt noch ein \r\n damit eine neue Zeile beginnt.

    strcat(tmp,"\r\n");
    

    Hoffe es ist jetzt verständlicher 🙂

    Gruß
    Eichhorn 🙂



  • Eichhorn schrieb:

    Nun gut.
    char test1[11]={'1','2','3','4','5','6','7','8','9','0','\0'};

    Dött geht a bissli einfacher:

    char test[] = "0123456789"
    

    Eichhorn schrieb:

    Außerdem habe ich noch

    char endstring[100]="\0";
    

    hier soll ganz am ende der string stehen, welcher, wenn ich ihn am PC abspeicher als CSV-Datei geöffnet und betrachtet werden kann. Deshalb muss zwischen test1 und test2 ein ; hin

    itoa((test1[abs(ime-i)]-48),tmp,10);
    strcat(tmp, ";");
    itoa((test2[abs(ime-i)]-48),tmp2,10);
    

    und nach test2 kommt noch ein \r\n damit eine neue Zeile beginnt.

    strcat(tmp,"\r\n");
    

    Da würde ich mal zu sprintf raten.

    Hier noch ein paar Anregungen:

    int main ()
    {
    	int i;
    
    	char test2[11]={'0','9','8','7','6','5','4','3','2','1','\0'}; // ooooh!
    	char test[] = "0123456789"; // <- das Nullbyte spendiert freundlicher weise der Compiler :)
    
    	char *p=test; // der zeigt auf test, der hund!
    
    	printf("%s %s do you feel the difference?\n", test2,test);
    	printf ("sizeof(test): %d <- Ja, 11; das Nullbyte wird mitgezählt !\n", sizeof(test) );
    
    	for (i=0; i<sizeof(test)-1; i++)
    		printf ("ascii nr.: %3d macht konsolen-gucki: %c\n", i, i );
    
    	for (i=0; i<sizeof(test)-1; i++)
    		printf ( "'ascii to dec' macht konsolen-gucki: %d\n", test[i]-48);
    
    	// And now, the zerobyte controlled while-loop :)
    	while(*p) // Kontrolle übers Nullbyte.
    	{
    		putchar((*p)+48);
    			p++;
    	}
    
    	return 0;
    }
    

    Gruß,
    B.B.



  • Also ich hab mal mit "Hello World!" gespielt.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>  // Beinhaltet Funktionen zur Manipulation von Strings
    
    int main (void)
    {
        char *strng_1 = "Hello";
        char *strng_2 = "World!";
        char *merge_strng;
    
        merge_strng = malloc(strlen(strng_1) + 2);  // +1 für das Leerzeichen
    
        strcat(merge_strng, strng_1);
        strcat(merge_strng, " ");
    
        merge_strng = realloc(merge_strng, strlen(merge_strng) + strlen(strng_2) + 1);
        // +2 für das newline-Zeichen (\n) und das termination-Zeichen (\0)
    
        strcat(merge_strng, strng_2);
        strcat(merge_strng, "\n");
    
        puts(merge_strng);
    
        return 0;
    }
    

    Ausgabe

    Hello World!
    // hier ist eine leere Zeile die der [code]-tag nicht anzeigen möchte...
    

    Ich hoff es hilft was.

    Greetz



  • Hi,

    Spence schrieb:

    char *strng_1 = "Hello";
        char *strng_2 = "World!";
        char *merge_strng;
        
        merge_strng = malloc(strlen(strng_1) + 1);  // +1 für das Leerzeichen
        
        strcat(merge_strng, strng_1);
        strcat(merge_strng, " ");
    
        merge_strng = realloc(merge_strng, strlen(merge_strng) + strlen(strng_2) + 
    }
    

    dir ist aber schon bewusst, dass du beim malloc Aufruf Speicher fuer 6Bytes reservierts, aber 7 reinkopierst !?
    "hallo" -> 5Bytes ' ' -> 1Byte '\0' -> 1Byte.

    Gruesslin Pingu



  • Oh, ja, du hast recht. Danke.
    "+2" sollte bei malloc() stehen.

    Habs geändert, jetzt müsst es stimmen.

    Greetz


Anmelden zum Antworten