strlcat und sizeof
Verfasst: Di Okt 18, 2016 3:42 pm
Hallo zusammen, ich melde mich nach viel zu langer Zeit zurück, und habe direkt eine Frage.
Ich habe in einem kleinen Projekt folgende Funktion gefunden:
Das sieht mir recht umständlich aus, das muss doch mit boardmitteln gehen.
Ich habe mir dann strcpy und strcat angeguckt, um dann zu lesen man solle lieber strlcpy und strlcat verwenden.
Jetzt verstehe ich aber den dritten Parameter von strlcpy und strlcat nicht.
In der Doku steht
Ich hätte ja gedacht, es hätte sizeof(s) bzw. sizeof(p) heißen müssen.
Außerdem gibt mir sizeof(res) immer 8 zurück.
Dadurch habe ich jetzt das Problem, dass das Ergebnis nicht vollständig ist.
Also ich habe jetzt folgenden Code:
Ausgegeben wird mir
Wenn ich das sizeof(res) durch 256 ersetze funktioniert es, aber das scheint ja nicht richtig zu sein?
Wo ist mein Denkfehler?

Ich habe in einem kleinen Projekt folgende Funktion gefunden:
Code: Alles auswählen
void MakeName (const char *txt, char *res)
{
Uint16 i;
for (i=0;i<strlen(RESOURCES);i++)
{
res[i] = RESOURCES[i];
}
for (i=strlen(RESOURCES);i<=strlen(RESOURCES)+strlen(txt);i++)
{
res[i] = txt[i-strlen(RESOURCES)];
}
}
Ich habe mir dann strcpy und strcat angeguckt, um dann zu lesen man solle lieber strlcpy und strlcat verwenden.
Jetzt verstehe ich aber den dritten Parameter von strlcpy und strlcat nicht.
In der Doku steht
und als BeispielThe strlcpy() function copies up to size - 1 characters from the NUL-terminated string src to dst, NUL-terminating NULterminating
terminating the result.
Code: Alles auswählen
strlcpy(buf, s, sizeof(buf));
strlcat(buf, p, sizeof(buf));
Außerdem gibt mir sizeof(res) immer 8 zurück.
Dadurch habe ich jetzt das Problem, dass das Ergebnis nicht vollständig ist.
Also ich habe jetzt folgenden Code:
Code: Alles auswählen
const char *RESOURCES = "";
char temp[256];
MakeName("arial.ttf", temp, RESOURCES);
void MakeName (const char *txt, char *res, const char *path)
{
strlcpy(res, path, sizeof(res));
strlcat(res, txt, sizeof(res));
printf("Read::MakeName - '%s' - '%s'\n", txt, res);
}
Code: Alles auswählen
Read::MakeName - 'arial.ttf' - 'arial.t'
Wo ist mein Denkfehler?