Eleu Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Hallo, ich möchte gerne ein Char Array auf Inhalt überprüfen und dementsprechend ändern. Hintergrund ist folgender: Mit der Funktion (GetTagChar) lese ich eine Prozessvariable ein. Je nach dem, was in der Prozessvariablen drinsteht, steht in der Variablen "pszProp" (Auch Datentyp: char) entweder ein 1 stelliger Wert, ein 2 stelliger Wert, oder ein 3 stelliger Wert drin. Also entweder 1 Byte, 2 Byte, oder 3 Byte sind belegt. Als Ergebnis soll aber über die Funktion printf immer 6 Byte ausgegeben werden. In dem Code Beispiel wird der Char Variable "source" 3 Zeichen übergeben. Code Ausschnitt: -------------------------------------- char source[255] = "000"; char* pszProp = NULL; pszProp = GetTagChar("Prozessvariable"); ggg[255] == strcpy(ggg,pszProp); strcat(source,ggg); printf(source); ----------------------------------------- Stehen in der Prozessvariable zum Beispiel die Zeichen "123" drin, würde folgendes ausgegeben werden: 000123 Stehen aber in der Prozessvariablen zum Beispiel die Zeichen "12" drin, würde folgendes ausgegeben werden: 00012 Es soll dann aber 000012 ausgegeben werden. (Also immer 6 Zeichen). Ich müsste also vorher die Prozessvariable auf ihren Inhalt hin überprüfen, und je nach dem was drin steht muss der Variablen "source" entweder 2, 3, oder 4 Nullen übergeben werden. Ich bekomm das irgendwie nicht hin. Kann mir jemand helfen. Gruß Eleu Zitieren
Hexagon Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Moin. Eine kurze Frage: Warum so umständlich? Wieso nicht die Ausgabe formatieren? Zitieren
lilith2k3 Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Moin. Eine kurze Frage: Warum so umständlich? Wieso nicht die Ausgabe formatieren? Und vorher gerne noch in int umwandeln Zitieren
Hexagon Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Ähm... wieso? Stehe gerade etwas auf der Leitung... Zitieren
Guybrush Threepwood Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Weil du AFAIK nur Zahlen so formatiert ausgeben kannst das da eine bestimmte Anzahl führender Nullen angezeigt wird Zitieren
Hexagon Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Also, char *pointer1="1"; char *pointer2="12"; char *pointer3="123"; printf(" %06s \n", pointer1); printf(" %06s \n", pointer2); printf(" %06s \n", pointer3); gibt mir 000001 000012 000123 aus. Jedenfalls bei mir... Zitieren
Eleu Geschrieben 13. Oktober 2011 Autor Geschrieben 13. Oktober 2011 Also, char *pointer1="1"; char *pointer2="12"; char *pointer3="123"; printf(" %06s \n", pointer1); printf(" %06s \n", pointer2); printf(" %06s \n", pointer3); gibt mir 000001 000012 000123 aus. Jedenfalls bei mir... Super....vielen Dank Euch allen. Werd ich gleich morgen mal ausprobieren. Gruß Eleu Zitieren
Eleu Geschrieben 13. Oktober 2011 Autor Geschrieben 13. Oktober 2011 Ach so... eine Frage noch. Funktioniert das auch strcat ? Ich muss das Ergebnis nicht nur ausgeben, sondern auch in der Variablen "source" weiterverarbeiten. Also so: ----------------------------------- char* pszProp = NULL; pszProp = GetTagChar("Prozessvariable"); source[255] == strcpy(source,pszProp); strcat(" %06s \n",source); printf(source); Zitieren
Guybrush Threepwood Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 dann scahu dir mal sprintf an, bzw noch besser snprintf Zitieren
Hexagon Geschrieben 13. Oktober 2011 Geschrieben 13. Oktober 2011 Und btw...source[255] == strcpy(source,pszProp); schaut ziemlich unsinnig aus... Zitieren
Klotzkopp Geschrieben 14. Oktober 2011 Geschrieben 14. Oktober 2011 (bearbeitet) schaut ziemlich unsinnig aus...Noch schlimmer, es ist undefiniert. @Eleu: Überleg bitte mal genau, was source[255] bedeutet: source[0] ist das erste Element des Arrays source. source[1] ist das zweite Element des Arrays source. ... Was ist dann source[255]? Ganz klar: Das 256. Element des Arrays source Das Array hat aber nur 255 Elemente. Du vergleichst also den Rückgabewert von strcpy mit der Speicherstelle, die hinter deinem Array steht, und das Ergebnis des Vergleichs ignorierst du. Bearbeitet 14. Oktober 2011 von Klotzkopp Zitieren
Eleu Geschrieben 14. Oktober 2011 Autor Geschrieben 14. Oktober 2011 Und btw...source[255] == strcpy(source,pszProp); schaut ziemlich unsinnig aus... Ja, stimmt. Es geht auch einfacher. Manchmal braucht man nur mal eben den entscheidenden Hinweis Hab es jetzt so gemacht: --------------------------------------------------- char source[255]; sprintf(source," %06s \n",GetTagChar("Prozessvariable")); printf(source); --------------------------------------------------- Funktioniert wie gewünscht. Nochmals Danke. Gruß Eleu Zitieren
Klotzkopp Geschrieben 14. Oktober 2011 Geschrieben 14. Oktober 2011 Funktioniert wie gewünscht.Nur wenn GetTagChar garantiert nichts zurückgibt, das ein Prozentzeichen enthält. So ist es sicherer: printf("%s", source); Zitieren
Eleu Geschrieben 23. Januar 2012 Autor Geschrieben 23. Januar 2012 Also, char *pointer1="1"; char *pointer2="12"; char *pointer3="123"; printf(" %06s \n", pointer1); printf(" %06s \n", pointer2); printf(" %06s \n", pointer3); gibt mir 000001 000012 000123 aus. Jedenfalls bei mir... Hallo Hexagon, ich könnte noch mal Deine oder Eure Hilfe gebrauchen. Und zwar möchte ich bezogen auf das Beispiel die nachfolgende Ausgabe bekommen: 100000 120000 123000 Mit den Ausgabeformaten geht das nicht, oder doch ? Vielleicht mit strcat ? Gruß Zitieren
Klotzkopp Geschrieben 23. Januar 2012 Geschrieben 23. Januar 2012 char* fill = "000000"; printf(" %s%s \n", pointer1, fill + strlen(pointer1));[/code] Du musst allerdings sicherstellen, dass der erste String niemals länger als 6 Zeichen wird. Zitieren
Eleu Geschrieben 23. Januar 2012 Autor Geschrieben 23. Januar 2012 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 Zitieren
Klotzkopp Geschrieben 23. Januar 2012 Geschrieben 23. Januar 2012 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. Zitieren
Eleu Geschrieben 24. Januar 2012 Autor Geschrieben 24. Januar 2012 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): { char *var1 = NULL; char var2[255]; var1 = strcpy(var2,"123456"); strcat(var1," "); printf(var1); } Variante 2: { char *var1 = NULL; char var2[255]; var1 = strcpy(var2,"123456"); strcat(var2," "); printf(var2); } Variante 3 (Endfassung): { 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 !!! :old) 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 Zitieren
Klotzkopp Geschrieben 24. Januar 2012 Geschrieben 24. Januar 2012 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. 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. Zitieren
Eleu Geschrieben 24. Januar 2012 Autor Geschrieben 24. Januar 2012 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.:confused::confused: Zitieren
Klotzkopp Geschrieben 24. Januar 2012 Geschrieben 24. Januar 2012 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. 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. Das alte Programm läuft schon lange störungsfrei. Ich habe es jetzt ein paar mal ausprobiert....alles oki.:confused::confused: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? Zitieren
Eleu Geschrieben 24. Januar 2012 Autor Geschrieben 24. Januar 2012 Ich kann es nicht reproduzieren. Es klappt jetzt merkwürdigerweise auch mit strcat :confused: Die Empfehlung strncat zu nehmen habe ich hierher: Probleme im C-Script mit strcat - Siemens Industry Online Support - Technical Forum (Guest) Zitieren
Eleu Geschrieben 24. Januar 2012 Autor Geschrieben 24. Januar 2012 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:( Zitieren
Klotzkopp Geschrieben 24. Januar 2012 Geschrieben 24. Januar 2012 Die Empfehlung strncat zu nehmen habe ich hierher:Die Empfehlung ist an sich richtig, aber die Umsetzung ist falsch. strncat(x, y, strlen(y)) ist genau dasselbe wie strcat(x, y) strncat so zu benutzen, ist komplett sinnlos. Es könnte auch sein, dass ich diesen Fehler gemacht habe: Keine Ahnung, kann sein. In deinem Beispielcode machst du ihn jedenfalls nicht. Zitieren
Eleu Geschrieben 24. Januar 2012 Autor Geschrieben 24. Januar 2012 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: 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: strcat(Var1," "); sprintf(Var2,Var1); Was natürlich Käse ist. Jetzt sieht es so aus: strcpy(Var2,Var1); strcat(Var2," "); Und das klappt, weil für "Var2" Speicher reserviert wurde Danke für Deine Unterstützung. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.