Leser: 1
8 Einträge, 1 Seite |
sprintf(&str[0], "INSERT INTO data (v1, v2, v3, v4) VALUES ('%s', '%s', '%s', '%s')", f[0], f[1], f[2], f[3]);
1
2
3
4
sprintf(&str[0], "INSERT INTO data (v1, v2, v3, v4) VALUES ('%s', '%s', '%s', '%s')\0", f[0], f[1], f[2], f[3]);
printf("%s\n", &str[0]);
sprintf(&str[1], "INSERT INTO data (v1, v2, v3, v4) VALUES ('%s', '%s', '%s', '%s')", f[4], f[5], f[6], f[7]);
printf("%s\n", &str[1]);
1
2
3
4
sprintf(&str[0], "INSERT INTO data (v1, v2, v3, v4) VALUES ('%s', '%s', '%s', '%s')\0", f[0], f[1], f[2], f[3]);
sprintf(&str[1], "INSERT INTO data (v1, v2, v3, v4) VALUES ('%s', '%s', '%s', '%s')", f[4], f[5], f[6], f[7]);
printf("%s\n", &str[0]);
printf("%s\n", &str[1]);
1
2
3
sprintf(&str[0], "INSERT INTO data (v1, v2, v3, v4) VALUES ('%s', '%s', '%s', '%s')\0", f[0], f[1], f[2], f[3]);
sprintf(&str[25], "INSERT INTO data (v1, v2, v3, v4) VALUES ('%s', '%s', '%s', '%s')\0", f[4], f[5], f[6], f[7]);
printf("%s", &str[25])
1
2
3
4
5
6
7
8
9
10
11
#define FMT "INSERT INTO data (v1, v2, v3, v4) VALUES ('%s', '%s', '%s', '%s')"
#define NSTMTS 3
#define BUFSIZE 1024
int i;
char stmts[NSTMTS][BUFSIZE];
for (i = 0; i < NSTMTS; i++) {
/* ... get data into the array f ... */
assert(snprintf(stmts[i], BUFSIZE, FMT, f[0], f[1], f[2], f[3]) < BUFSIZE - 1);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define FMT "INSERT INTO data (v1, v2, v3, v4) VALUES ('%s', '%s', '%s', '%s')"
#define NSTMTS 3
int i;
char *stmts[NSTMTS];
for (i = 0; i < NSTMTS; i++) {
size_t s;
char *p;
/* ... get data into the array f ... */
s = snprintf(NULL, 0, FMT, f[0], f[1], f[2], f[3]) + 1;
assert((p = (char *)malloc(s)) != NULL);
snprintf(p, s, FMT, f[0], f[1], f[2], f[3]);
}
/* ... do something with the statements ... */
for (i = 0; i < NSTMTS; i++)
free(stmts[i]);
RPerl+2007-10-27 17:18:02--Hallo jungs,
QuoteMit char *str[1024]; deklarierst Du ein Feld von 1024 Zeigern auf Zeichen, dann aber sagst Du mittels sprintf(&str[0], ...); "Nimm das erste Element des Feldes str -- also den ersten Zeiger -- berechne seine Adresse, konvertiere diese Adresse implizit vom Typ Zeiger auf Zeiger auf Zeichen in den Typ Zeiger auf Zeichen und speichere dort die Zeichenkette, die sprintf berechnet". Das ist -- wegen der Typkonversion -- eine komische Anweisung, die Dein Compiler vermutlich auch angemeckert hätte, wenn Du vorsichtigerweise mit eingeschalteten Warnungen kompiliert hättest.
1
2
3
---
INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2, v3, v4) VALUES ('127.0.0.1', 'hostname', 'port', 'test')
---
Quotezwar eine Warnung, aber der code tut was er tun soll.warning: passing argument 1 of sprintf from incompatible pointer type
QuoteDas Programm verhält sich genau so, wie es sollte, allerdings verletzt Du hier die strikte Typisierung der Zeiger, was schlechter Stil ist, und Du führst keinerlei Überprüfungen von Zeichenkettenlängen durch, um Pufferüberläufe zu verhindern, was noch viel schlechterer Stil ist.
GwenDragon+2007-10-27 19:50:45--RPerl+2007-10-27 17:18:02--Hallo jungs,
Hallo Mädel!
[...]
GwenDragonIch empfehle ein Standard-C-Lehrbuch von Kernigham&Richie zu lesen! Nicht C++, wohl gemerkt.
Dann werden die Datentypen und deren Definition unter C auch klarer!
GwenDragonSchönen Abend noch.
RPerl+2007-10-27 20:04:05--[...]
Ok - wenn ich nur:
char str[1024]
mache, bekomme ich wieder eben falsche Werte.
Quote[...]
Ich haette fuer die query Generierung auch Bind parameter von mysql.h nutzen koennen, aber dafuer haet ich umstaendlicherweise eine Struktur erstellen muessen - das ist etwas "oversized".
QuoteNa klar funktioniert das nicht! Schau Dir doch bitte nochmal die Codeschnipsel an, die ich in meinen letzten Beitrag geschrieben habe -- die sollten nämlich tun, was Du willst. Fall sie es nicht tun, weil ich zu schnell getippt habe, oder falls Dir daran etwas unklar ist, kannst Du ja nachfragen.
QuoteUnd wenn es Dir zu viel Aufwand ist, eine simple Struktur wie MYSQL_BIND auf dem Stack anzulegen, dann befürchte ich, dass Du mit C insgesamt nicht viel Freude haben wirst...
8 Einträge, 1 Seite |