c printf size_t
Mein code kompiliert werden, obwohl die printf
keine Anzeige mehr?
Wenn ich den formatter Teil der printf
dann funktioniert es Prima.
#include <stdio.h>
size_t MyStrlen(const char *s1)
{
const char *s1Copy = s1;
while (*s1)
{
*s1Copy++;
}
return s1Copy -s1;
}
int main(void)
{
const char str[] = "HELLO";
printf("Length: %d \n", (unsigned int)MyStrlen(str));
return 0;
}
- Ich denke, mit
%u
ohne cast das Ergebnis ist in Ordnung. - Nicht wirklich,, das wird brechen, wenn
size_t
undunsigned
sind nicht die gleiche Größe. - Oh, duh, rechts. Die
%u
halten sollte, obwohl. - Darüber hinaus
*s1Copy++
ist eine Verschwendung - da gibt es keine Notwendigkeit, Sie zu dereferenzieren, verwenden Sie einfachs1Copy++
. Und der richtige Weg (seit C99) zum drucken einersize_t
ist die Verwendung derz
Länge modifier wie mit"%zd"
.size_t
und dieint
-Klasse-Typen können ganz unterschiedliche breiten. Und ich werde nicht einmal zu Fragen beginnen, was Sie denken, ist falsch mit der stdlibstrlen
erfordern würde, dass Sie schreiben, Sie eigene 🙂 - Bitte ändern Sie nicht die Fragen zu dem Punkt, wo die Antworten werden völlig ungültig - das macht das gesamte Q&A nutzlos. Wenn Sie beheben die Schritte problem und es gibt ein anderes Problem, eine andere Frage stellen.
- Hoppla, ich rollte mich wieder auf die falsche version. Es sollte jetzt ok sein (d.h., die Frage enthält nun das problem, dass pb2q Antwort erklärt). Jason, pb2q Antwort, sagt "In deinem loop-test werden Sie wollen, um zu testen
*s1Copy
für nicht-NULL, nicht*s1
, die man nicht Inkrementieren." Das ist die einzige Sache, die Sie wirklich brauchen, um zu beheben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Ihre loop-test, den Sie testen möchten
*s1Copy
für nicht-NULL, nicht*s1
, die man nicht Inkrementieren. Wie es ist, da*s1
nie ändert, sind Sie zu Fuß nach rechts Weg vom Ende des Strings argument mits1Copy++
und der code wird nicht ordnungsgemäß beendet.Es sei denn natürlich, passieren Sie die leere Zeichenfolge: Ihre
MyStrlen
Methode wird Arbeit für die leere Zeichenfolge.Diese:
ist ok;
%d
erwartet eineint
argument, aber es ist garantiert, dassint
undunsigned int
haben die gleiche Darstellung für die Werte, die im Bereich der beiden. Diese:ist besser, da
%u
erwartet eineunsigned int
argument.Das richtige format für
size_t
ist"%zu"
:aber das ist ein "neues" feature in C99, und es gibt wahrscheinlich noch einige Implementierungen, die dies nicht unterstützen. (Insbesondere Microsoft nur sehr langsam vorangekommen zu unterstützen C99.) Für maximale Portabilität (vorausgesetzt, Ihr string ist nicht mehr als die 232-1 bytes lang), können Sie dieses verwenden:
Dieser beantwortet die Frage, die Sie gefragt
printf
; pb2q gekonnt diagnostiziert, die eigentliche Ursache des Problems, das Sie sehen (und mich zu schlagen!).z
längenmodifikator. Ich weiß nicht, warum die meisten C-Programmierer (andere als embedded-Entwickler, die vielleicht keine Wahl haben) sind noch immer in der Welt von vor 20 Jahren. Kommen Sie, besuchen Sie uns, Sie wissen, Sie wollen 🙂"%zu"
. Microsoft hat den Wunsch geäußert, einen deutlichen Mangel an Interesse an der Unterstützung der C99.s1Copy
Punkte zu dem abschließenden null-Zeichen'\0'
Ihrem string und*s1Copy
gibt den Wert der Zeichen, die0
. Die Vorherige version vons1Copy
war viel näher zu korrigieren. Ich werde zurückkehren, Ihre zu Bearbeiten.