Prozent Zeichen Bearbeiten
-
Hi Leute,
ich bin gerade dabei mit C/C++ ein Chrakter Array zu bearbeiten. Mein C/C++ Programm bekommt eine lange Text Datei aus einem extern System. Diese Text Datei wird erst gemäß einer bestimmten Länge durch stncat geparst und
anschließend weiter bearbeitet. Mein System beschwert sich aber, wenn ein geparster Teil ein Prozent Zeichen enthält. Als Lösung habe ich im Internet folgendes gefunden. Man sollte noch ein weiteres Prozent Zeichnen
einfügen, damit Prozent Zeichen korrekt ausgegeben bzw. bearbeitet werden kann. Das Problem ist, wenn ich % Zeichen durch %% ersetze, wird das Format wegen fester Länge verletzt.
Angenommen Ursprungliche Text Datei muss insgesamt aus 1.000 Buchstaben.(char text[1000]="Quelle Text.....") bestehen. Mein kritischer Teil muss zwischen 400 und 500. Offsets liegen und aus 100 Buchstaben entstehen.
Wenn ich % Zeichen durch %% ersetzen würde, würde mein String 101 statt 100 Buchstaben enthalten und das Parsen von restlichen Teil des String würde nicht mehr korrekt laufen.
Was für ein Lösung würden Sie mir an dieser Stelle vorschlagen, damit ich % Zeichen einwandfrei ausgeben kann ohne das vorhandene Format (Bufferlänge und feste Offsets) zu verletzen.Danke im Voraus
-
Mein C/C++ Programm
Was denn nu? Hoffentlich nicht beides!
Aus deinem restlichen Text geht hervor, dass auch C-ähnlich geparst wird (feste Länge der Strings, usw.). Nutzt dustd::string
undifstream
?Mein System beschwert sich aber, wenn ein geparster Teil ein Prozent Zeichen enthält.
Da liegt dein Problem. Du liest offensichtlich nicht unformatiert sondern formatiert ein. Das
%
-Zeichen wird zum formatierten I/O in verschiedenen C-Funktionen genutzt.
-
Arbeite mit std::string statt mit char-array und strncat.
-
beterman schrieb:
Mein System beschwert sich aber, wenn ein geparster Teil ein Prozent Zeichen enthält. Als Lösung habe ich im Internet folgendes gefunden. Man sollte noch ein weiteres Prozent Zeichnen
einfügen, damit Prozent Zeichen korrekt ausgegeben bzw. bearbeitet werden kann.Beschwert sich? Könntest du das etwas näher ausführen? Zumindest beim nächsten Mal?
Die einzigen Standardfunktionen, die Probleme mit %-Zeichen haben, sind printf, scanf und Co., vielleicht noch sowas wie strftime. Und auch nur, wenn man sie falsch benutzt. Zeig mal den entsprechenden Code, und man wird dir sagen, wie es richtig geht.
-
Das Problem ist mit C geschrieben worden. C++ Codes wurden aber aus historischen Gründen hinzugefügt. Wir reden hier über ein Programm, das %80 mit C geschrieben worden ist. Mein System beschwert sich, weil System Abstürze oder Core Dumps wegen des % Zeichens auftreten können. (Ich gehe davon aus, dass das Problem an % Zeichen liegt)
struct BookingRemark { char line[75+1]; }; BookingRemark m_bookingRemarks; char m_getBookingRecordStr [2000 + 1]; // Quellestring const char* parseBookingRemark( ) const { char * pc = this->m_bookingRemarks.line; strncat( pc, m_getBookingRecordStr // Quellestring + 1000, // Offset 75); // Data Länge return pc; };
Wie man oben deutlich sehen kann, hat der String eine feste Länge 75. Ich muss diese Länge behalten, wenn ich % durch %% ersetzen soll. Weil nächter String ab 1075. Offset anfängt, der genauso geparst werden soll. Das Ersetzen von % Zeichen durch %% wird die Anzahl der Länge um 1 erhöhen und so wird nächste String nicht korrekt geparst werden. Das ist mein Problem. Ein Lösung Vorschlag?
-
Ich lese:
Das Problem ist [...] C [...]
Und was zum Teufel soll das heißen, ihr habt C++ aus historischen Gründen hinzugefügt...
-
beterman schrieb:
strncat( pc, m_getBookingRecordStr // Quellestring + 1000, // Offset 75); // Data Länge
Sieht eher danach aus, dass Du
strncpy()
meinst.Ich bezweifle, dass %-Zeichen Ursache für Dein Problem sind. (Kannst sie ja mal mit anderen Zeichen ersetzen, die sicher nicht im String vorkommen '\v' (vertical tab), oder '\a'(bell). Und nachher wieder zurückersetzen.)
Spannend wäre mal zu wissen, was Du machen willst. Auch ein kleines kompilierbares Beispiel, das Dein Problem verdeutlicht wäre nett.
-
beterman schrieb:
C++ Codes wurden aber aus historischen Gründen hinzugefügt.
?! C++ und historisch? Was ist C dann?
beterman schrieb:
Wir reden hier über ein Programm, das %80 mit C geschrieben worden ist.
Eine originäre C++ Anweisung reicht, um aus dem ganzen Programm ein nicht mehr mit einem C Compiler compilierbares also ein C++ Programm zu machen.
beterman schrieb:
Mein System beschwert sich, weil System Abstürze oder Core Dumps wegen des % Zeichens auftreten können.
Wer oder was ist "mein System"? Wie heißt die konkrete Fehlermeldung?
-
char * strncat ( char * destination, const char * source, size_t num );
Die Längeangabe bei
strncat
(num) gibt die Anzahl der maximal anzuhängenden Zeichen an und nicht die Maximallänge vom Zielstring (s1).Wenn bei dir schon Zeichen in .line (pc) stehen, kann es trotzdem zum Überlauf kommen.
-
Das Programm sollte eigentlich nur mit C geschrieben werden. Es geht um hier ein Programm, das im Moment bei einer Firma im Einsatz ist. Viele Entwickler haben aus verschieden Gründen leider kleiner C++ Codes hinzugefügt. Ich versuche aber wie möglich lediglich C Codes zu schreiben.
char m_getBookingRecordStr [273 + 1] = "Die stille Welt zu meinen Füßen,Entzündet alle Höhn, beruhigt jedes Tal,Den Silberbach in goldene Ströme fließen.Nicht hemmte dann den göttergleichen LaufDer % wilde Berg mit allen seinen Schluchten;Schon tut das Meer sich mit erwärmten BuchtenVor den erstaunten Augen auf"
Aus diesem String muss das Teil Nicht hemmte dann den göttergleichen LaufDer % wilde Berg mit allen seinen Schluchten geparst werden, der absichtlich % Zeichen enthält. Dieses Teil mit % Zeichen muss später mit der sprintf() Funktion in einer Logfile geschrieben werden. In diesem Fall trift ein System Absturz oder Core Dump wegen des Zeichens % auf.
Quelle Text (m_getBookingRecordStr) hat insgesamt fest 273 Länge. Der geparste String fängt ab 114. Offset und hat Länge 86. Diese Offsets und Länge sind fest definiert und können nicht geändert werden. Wenn ich % Zeichen durch %% ersetze, dann wird Länge um 1 erhöhen. Das wird ganze Parsen Logik wegen fest Offsets Länge kaputt machen. Ich muss an dieser Stelle erwähnen, dass nicht Jede Quelle Text (m_getBookingRecordStr) unbedignt ein % Zeichen enthalten soll. Deswegen muss ich vorher überprüfen, ob Quelle Text ein % Zeichen enthält oder nicht. (Es ist aber an dieser Stelle kein Thema von uns). Was ich damit sagen wollte, kann ich fest definierte Offset nicht um 87 erweitern, weil der % Zeichen nicht immer in der Quelle Text erscheint.
-
Du darfst nicht
printf(mein_geparster_Text);
machen, sondernprintf("%s", mein_geparster_Text);// Formatstring als Stringliteral
Wobei es da bessere Funktionen gibt, je nachdem welche xprintf du benutzt.
beifprintf
undprintf
wäre dasfputs
.
beisprintf
ist dasstrcpy