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
+ Antworten
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 ...
- 23.01.2012 14:50 #16
Was wahr ist, ist weder gut noch böse, sondern einfach wahr !
Rabindranath Tagore, bengalischer "Alleskünstler" (1861 - 1941), Nobelpreis für Literatur 1913
- 23.01.2012 15:01 #17
Administrator + Moderator
C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
- Reg.-Datum
- 10.07.2001
- Ort
- Essen
- Beiträge
- 8.980
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.
- 24.01.2012 08:13 #18
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):
Variante 2:Code:{ char *var1 = NULL; char var2[255]; var1 = strcpy(var2,"123456"); strcat(var1," "); printf(var1); }
Variante 3 (Endfassung):Code:{ char *var1 = NULL; char var2[255]; var1 = strcpy(var2,"123456"); strcat(var2," "); printf(var2); }
Das Ergebnis der Ausgabe:ist bei allen 3 Codeschnipseln 123456 mit 20 Leerzeichen im Anhang.Code:{ char *var1 = NULL; char var2[255]; var1 = strcpy(var2,"123456"); strncat(var2," ",20); printf(var2); }
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ß
EleuWas wahr ist, ist weder gut noch böse, sondern einfach wahr !
Rabindranath Tagore, bengalischer "Alleskünstler" (1861 - 1941), Nobelpreis für Literatur 1913
- 24.01.2012 08:40 #19
Administrator + Moderator
C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
- Reg.-Datum
- 10.07.2001
- Ort
- Essen
- Beiträge
- 8.980
Alle 3 Varianten sind funktional identisch. Wenn die erste bei dir Probleme gemacht hat, steckt vermutlich ein Bug irgendwo im Rest des Programms.
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.
- 24.01.2012 09:16 #20
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
- 24.01.2012 09:52 #21
Administrator + Moderator
C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
- Reg.-Datum
- 10.07.2001
- Ort
- Essen
- Beiträge
- 8.980
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.
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.
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.
- 24.01.2012 10:04 #22
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
- 24.01.2012 10:29 #23
Es könnte auch sein, dass ich diesen Fehler gemacht habe:
Siemens Industry Online Support - Automation Service, Automation Support, Simatic Service, Simatic Support, Technical Support, Technical Consulting
Ist jedenfalls nicht unmöglich
Was wahr ist, ist weder gut noch böse, sondern einfach wahr !
Rabindranath Tagore, bengalischer "Alleskünstler" (1861 - 1941), Nobelpreis für Literatur 1913
- 24.01.2012 10:49 #24
Administrator + Moderator
C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
- Reg.-Datum
- 10.07.2001
- Ort
- Essen
- Beiträge
- 8.980
"Funktioniert nicht" ist keine ausreichende Problembeschreibung.
- 24.01.2012 11:28 #25
Ja, und das liegt daran, dass mein Beispiel, mit dem ich eine Analogie herstellen wollte, ein schlechtes Beispiel ist.
Ursprünglich stand dort:
Wobei "Var1" eine Pointer Variable ist, für die kein Speicher reserviert wurde.Code:sprintf(Var2," %030s \n",Var1);
Und ich habe dann das davon gemacht:
Was natürlich Käse ist.Code:strcat(Var1," "); sprintf(Var2,Var1);
Jetzt sieht es so aus:
Und das klappt, weil für "Var2" Speicher reserviert wurdeCode:strcpy(Var2,Var1); strcat(Var2," ");
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
-
Ausgabe char-Array
Von SaJu im Forum JavaAntworten: 1Letzter Beitrag: 13.12.2010, 12:24 -
Aus String Array in Char Array zum Sortieren
Von notorious.madeye im Forum C und C++Antworten: 5Letzter Beitrag: 27.10.2005, 15:44 -
Variant auf leeren Inhalt überprüfen
Von Riceman im Forum BasicAntworten: 3Letzter Beitrag: 26.04.2005, 11:47 -
Char Array
Von SwordMaster im Forum C++: Compiler, IDEs, APIsAntworten: 2Letzter Beitrag: 18.08.2003, 08:00 -
char-Array to Int
Von Technician im Forum C und C++Antworten: 1Letzter Beitrag: 18.10.2002, 15:46

LinkBack URL
About LinkBacks
Zitieren