PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C]: Wie ein Zeichen in einem String maskieren?


mf_2
2008-02-01, 22:31:36
Hallo,

ich habe einen String von max. 1024 Zeichen Länge. Im String steht eine Benutzereingabe, welche unter anderem auch die Hochkommata enthalten kann. Diese sollten erhalten bleiben, aber maskiert werden. Sprich aus ' soll \' werden.
Wie kann ich so etwas in C am besten machen? Gibts da eine gute Stringfunktion?

Gruß,
mf_2

Kinman
2008-02-01, 23:03:40
z.B. mit Regular Expressions (http://de.wikipedia.org/wiki/Regulärer_Ausdruck)
Aber ds ist fast wie mit Kanonen auf Spatzen schießen

http://people.delphiforums.com/gjc/winregex.html

mfg Kinman

mf_2
2008-02-01, 23:29:59
Um in der Metapher zu bleiben: Was wäre denn dann das Luftgewehr?
Oder kennt jemand eine Beschreibung aller C String Funktionen in string.h, vllt. finde ich da etwas.
Ich würde mir ja selbst etwas schreiben mit so einer Art for Schleife und dann einfach alle Vorkommen von ' ersetzen, aber das Problem ist, dass ich ein Zeichen mit zweien ersetzen will und das Ganze dadurch im Eigenbau sehr kompliziert wird. Deswegen suche ich so eine vorgefertigte Funktion (bin da etwas verwöhnt von PHP).

Kinman
2008-02-01, 23:38:40
In Eigenbau gehts auch weniger kompliziert und dadurch auch weniger elegant.

Du gehst den String Zeichen für Zeichen durch und jedesmal wenn Du auf ein ' stößt kopierst Du den String von der Letzen gefundenen Stelle (bzw. vom Anfang) mittels strncpy in einen neuen String und fügst anschließend ein \ an und machst dann weiter.

Buh, meien C Kenntnisse sind vielleicht was von verrostet :(

mfg Kinman

Gast
2008-02-02, 00:36:48
Ich weiß zwar nicht, wie leicht oder schwer sich regex in C verwenden und bedienen lässt, aber im Bezug zum Aufwand würde ich regex eher als das Luftgewehr bezeichnen, verglichen mit dem Manuellen.

Neomi
2008-02-02, 02:30:39
Klar sind Regular Expressions eine schöne Sache, aber für eine solche Minifunktion lohnt sich sowas nicht extra einzubauen. Wenn man auf die Kindermädchen.lib verzichten kann, baut man sich halt mal eben sowas:

void EscapeQuotes(TCHAR *dst, size_t max, TCHAR *src)
{
assert(src != NULL);
assert(dst != NULL);
assert(max > 0);

size_t s = 0, d = 0;

while ((scr[s] != _T('\0')) && (d + 1 < max))
{
if (src[s] == _T('\''))
{
if (d + 2 < max)
dst[d++] = _T('\\');
else
break;
}

dst[d++] = src[s++];
}

dst[d] = _T('\0');

return;
}

Und das ist schon fast eine Luxusvariante mit Unicode-Kompatibilität, Schutz des Zielbuffers vor einem Überlauf und Assertions für den Debug-Modus. Hat gerade mal 3 Minuten gedauert.

Coda
2008-02-02, 18:29:15
Falls du das für eine SQL-Abfrage machen willst: Schlechte Idee.

The_Invisible
2008-02-02, 20:26:04
dazu gibt es meist schon fertige funktionen in den apis zb für mysql: http://dev.mysql.com/doc/refman/5.0/en/mysql-real-escape-string.html

mfg

Gast
2008-02-02, 20:56:11
Unter Verwendung von Stringfunktionen könnte man es so machen:

#include <string.h>
#include <memory.h>

void EscapeQuotes(char* pString)
{
....while (true)
....{
........char *pTick_Mark = strchr(pString,'\'');
........if (pTick_Mark == NULL) return;
........memcpy(pTick_Mark+1, pTick_Mark, 1 + strlen(pTick_Mark) );
........*pTick_Mark = '\\';
........pString = pTick_Mark + 2;
....}
}

mf_2
2008-02-03, 18:48:19
dazu gibt es meist schon fertige funktionen in den apis zb für mysql: http://dev.mysql.com/doc/refman/5.0/en/mysql-real-escape-string.html

mfg

Super danke! Das ist genau sowas was ich gesucht habe. Bin leider garnicht auf die Idee gekommen, dass die MySQL API sowas mitliefern könnte ;)