+ Antworten
Seite 2 von 2 ErsteErste 1 2
Ergebnis 16 bis 25 von 25

Char Array auf Inhalt überprüfen und dementsprechend ändern(Ansi C)

Diskussion über Char Array auf Inhalt überprüfen und dementsprechend ändern(Ansi C) in C und C++ der Kategorie Programmierung; Zitat von Klotzkopp Code: char* fill = "000000"; printf(" %s%s \n", pointer1, fill + strlen(pointer1)); Du musst allerdings sicherstellen, dass ...

  1. #16
    Reg.-Benutzer Avatar von Eleu
    Reg.-Datum
    28.02.2009
    Beiträge
    708

    Standard

    Zitat Zitat von Klotzkopp Beitrag anzeigen
    Code:
    char* fill = "000000";
    printf(" %s%s \n", pointer1, fill + strlen(pointer1));
    Du musst allerdings sicherstellen, dass der erste String niemals länger als 6 Zeichen wird.
    Hallo,

    vielen Dank.

    Ich habe das merkwürdige Phänomen, das wenn ich mit der Funktion strcat Leerzeichen anhänge, dass sich ab größer 10 Leerzeichen die Anwendung aufhängt.

    Also

    strcat(Var1," Hier 10 Leerz. ");

    klappt noch

    aber mit mehr als 10 Leerz. ist feierabend, obwohl in Var 1 nur 6 Zeichen enthalten sind,
    und der reservierte Speicher 30 Char Zeichen groß ist.

    Hast Du ne Ahnung woran das liegen könnte.

    Gruß
    Eleu
    Was wahr ist, ist weder gut noch böse, sondern einfach wahr !
    Rabindranath Tagore, bengalischer "Alleskünstler" (1861 - 1941), Nobelpreis für Literatur 1913

  2. #17
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    8.980

    Standard

    Aus dieser einzelnen Codezeile und deiner Beschreibung lässt sich der Fehler nicht erkennen. Zeig bitte mehr Code, am besten ein minimales Beispielprogramm, das den Fehler reproduziert.
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

  3. #18
    Reg.-Benutzer Avatar von Eleu
    Reg.-Datum
    28.02.2009
    Beiträge
    708

    Standard

    Hallo Klotzkopp,

    es klappt jetzt und ich glaube ich weiß auch welchen Fehler ich gemacht habe.

    Funktionsprinzip als verkürzte Fassung:

    Variante 1 (Urfassung die im großen Quellcodeblock den Fehler verursacht hat, bei größer 10 Leerzeichen):

    Code:
    {
    char *var1 = NULL;
    char var2[255];
    var1 = strcpy(var2,"123456");
    strcat(var1,"                    ");
    printf(var1);
    }
    Variante 2:

    Code:
    {
    char *var1 = NULL;
    char var2[255];
    var1 = strcpy(var2,"123456");
    strcat(var2,"                    ");
    printf(var2);
    }
    Variante 3 (Endfassung):

    Code:
    {
    char *var1 = NULL;
    char var2[255];
    var1 = strcpy(var2,"123456");
    strncat(var2,"                    ",20);  
    printf(var2);
    }
    Das Ergebnis der Ausgabe:ist bei allen 3 Codeschnipseln 123456 mit 20 Leerzeichen im Anhang.
    Ich denke aber mal, dass es nicht so gesund ist, wenn man mit strcat einen Zeiger verändert, und das daher der eigentliche Fehler rührt. (Dieser dumme Eleu !!! )
    Bei der letzten Variante wird strncat anstatt strcat verwendet.
    Diese Variante soll sicherer sein. Hab jedenfalls im Netz gelesen.
    Jedenfalls funktioniert es jetzt auch mit mehr als 10 Leerzeichen


    Gruß
    Eleu
    Was wahr ist, ist weder gut noch böse, sondern einfach wahr !
    Rabindranath Tagore, bengalischer "Alleskünstler" (1861 - 1941), Nobelpreis für Literatur 1913

  4. #19
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    8.980

    Standard

    Zitat Zitat von Eleu Beitrag anzeigen
    Das Ergebnis der Ausgabe:ist bei allen 3 Codeschnipseln 123456 mit 20 Leerzeichen im Anhang.
    Alle 3 Varianten sind funktional identisch. Wenn die erste bei dir Probleme gemacht hat, steckt vermutlich ein Bug irgendwo im Rest des Programms.

    Zitat Zitat von Eleu Beitrag anzeigen
    Ich denke aber mal, dass es nicht so gesund ist, wenn man mit strcat einen Zeiger verändert, und das daher der eigentliche Fehler rührt.
    Nachdem du den Rückgabewert von strcpy var1 zuweist, zeigt var1 auf den Anfang von var2. Es ist also völlig egal, mit welchen von beiden du str(n)cat aufrufst.
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

  5. #20
    Reg.-Benutzer Avatar von Eleu
    Reg.-Datum
    28.02.2009
    Beiträge
    708

    Standard

    Es hat bei mir auch einmal mit mehr als 10 Leerzeichen geklappt, als ich den Zeiger (Var1) mit strncat, anstatt mit strcat geändert hab.
    Dann muss es irgendwie an strcat liegen ?
    Sonst weiß ich nicht woran es gelegen hat.

    Das alte Programm läuft schon lange störungsfrei.
    Geändert wurde jetzt eigentlich nur, dass an Nutzdaten Leerzeichen angehangen werden, anstatt sie mit Nullen aufzufüllen.

    Ich habe es jetzt ein paar mal ausprobiert....alles oki.
    Was wahr ist, ist weder gut noch böse, sondern einfach wahr !
    Rabindranath Tagore, bengalischer "Alleskünstler" (1861 - 1941), Nobelpreis für Literatur 1913

  6. #21
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    8.980

    Standard

    Zitat Zitat von Eleu Beitrag anzeigen
    Es hat bei mir auch einmal mit mehr als 10 Leerzeichen geklappt, als ich den Zeiger (Var1) mit strncat, anstatt mit strcat geändert hab.
    Der Längenparameter von strncat dient dazu, anzugeben, wieviel Platz im Zielstring noch ist, damit nicht mehr reinkopiert wird. Wenn du da die Länge des anzuhängenden Strings angibst, verhält es sich genauso wie strcat, und ist damit auch kein bißchen sicherer.

    Zitat Zitat von Eleu Beitrag anzeigen
    Dann muss es irgendwie an strcat liegen ?
    Nein, wie gesagt: So wie du strncat benutzt, sollte es sich genau wie strcat verhalten. Entweder ist im Zielstring nicht genug Platz, oder die Speicherstruktur wurde vorher schon irgendwo beschädigt. Solche Fehler machen sich selten an der Stelle bemerkbar, an der sie verursacht werden.

    Zitat Zitat von Eleu Beitrag anzeigen
    Das alte Programm läuft schon lange störungsfrei.

    Ich habe es jetzt ein paar mal ausprobiert....alles oki.
    Das ist das "Schöne" an undefiniertem Verhalten: Es kann auch gut gehen. Dann änderst du etwas, und es knallt. Ausprobieren hilft da leider nicht.

    Kannst du ein Minimalbeispiel erstellen, das das Problem reproduziert?
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

  7. #22
    Reg.-Benutzer Avatar von Eleu
    Reg.-Datum
    28.02.2009
    Beiträge
    708

    Standard

    Ich kann es nicht reproduzieren.
    Es klappt jetzt merkwürdigerweise auch mit strcat

    Die Empfehlung strncat zu nehmen habe ich hierher:
    Probleme im C-Script mit strcat - Siemens Industry Online Support - Technical Forum (Guest)
    Was wahr ist, ist weder gut noch böse, sondern einfach wahr !
    Rabindranath Tagore, bengalischer "Alleskünstler" (1861 - 1941), Nobelpreis für Literatur 1913

  8. #23
    Reg.-Benutzer Avatar von Eleu
    Reg.-Datum
    28.02.2009
    Beiträge
    708
    Was wahr ist, ist weder gut noch böse, sondern einfach wahr !
    Rabindranath Tagore, bengalischer "Alleskünstler" (1861 - 1941), Nobelpreis für Literatur 1913

  9. #24
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    8.980

    Standard

    Zitat Zitat von Eleu Beitrag anzeigen
    Die Empfehlung strncat zu nehmen habe ich hierher:
    Die Empfehlung ist an sich richtig, aber die Umsetzung ist falsch.
    Code:
    strncat(x, y, strlen(y))
    ist genau dasselbe wie
    Code:
    strcat(x, y)
    strncat so zu benutzen, ist komplett sinnlos.

    Zitat Zitat von Eleu Beitrag anzeigen
    Es könnte auch sein, dass ich diesen Fehler gemacht habe:
    Keine Ahnung, kann sein. In deinem Beispielcode machst du ihn jedenfalls nicht.
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

  10. #25
    Reg.-Benutzer Avatar von Eleu
    Reg.-Datum
    28.02.2009
    Beiträge
    708

    Standard

    Zitat Zitat von Klotzkopp Beitrag anzeigen
    Keine Ahnung, kann sein. In deinem Beispielcode machst du ihn jedenfalls nicht.
    Ja, und das liegt daran, dass mein Beispiel, mit dem ich eine Analogie herstellen wollte, ein schlechtes Beispiel ist.

    Ursprünglich stand dort:
    Code:
    sprintf(Var2," %030s \n",Var1);
    Wobei "Var1" eine Pointer Variable ist, für die kein Speicher reserviert wurde.

    Und ich habe dann das davon gemacht:
    Code:
    strcat(Var1,"                      ");
    sprintf(Var2,Var1);
    Was natürlich Käse ist.

    Jetzt sieht es so aus:
    Code:
    strcpy(Var2,Var1);
    strcat(Var2,"                      ");
    Und das klappt, weil für "Var2" Speicher reserviert wurde
    Danke für Deine Unterstützung.
    Was wahr ist, ist weder gut noch böse, sondern einfach wahr !
    Rabindranath Tagore, bengalischer "Alleskünstler" (1861 - 1941), Nobelpreis für Literatur 1913

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Ähnliche Themen

  1. Ausgabe char-Array
    Von SaJu im Forum Java
    Antworten: 1
    Letzter Beitrag: 13.12.2010, 12:24
  2. Aus String Array in Char Array zum Sortieren
    Von notorious.madeye im Forum C und C++
    Antworten: 5
    Letzter Beitrag: 27.10.2005, 15:44
  3. Variant auf leeren Inhalt überprüfen
    Von Riceman im Forum Basic
    Antworten: 3
    Letzter Beitrag: 26.04.2005, 11:47
  4. Char Array
    Von SwordMaster im Forum C++: Compiler, IDEs, APIs
    Antworten: 2
    Letzter Beitrag: 18.08.2003, 08:00
  5. char-Array to Int
    Von Technician im Forum C und C++
    Antworten: 1
    Letzter Beitrag: 18.10.2002, 15:46

Die häufigsten Suchbegriffe für diese Seite:

char array inhalt überprüfen

char array inhalt prüfen

char[] auf inhalt prüfen

char array auf inhalt prüfen java

string auf inhalt überprüfen rpg

inhalt eines char prüfen