Zum Inhalt springen

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


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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...

Geschrieben
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

Geschrieben

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);

Geschrieben (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 von Klotzkopp
Geschrieben
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

  • 3 Monate später...
Geschrieben
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ß

Geschrieben
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

Geschrieben

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

Geschrieben
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.
Geschrieben

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:

Geschrieben
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?

Geschrieben
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.
Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...