Jeder bekam eine Idee, was ich falsch mache
strlen()
gibt einen size_t
, die einen nicht signierten Integer-Typ ist. -1
interpretiert als eine vorzeichenlose Ganzzahl ist ein großer Wert, so dass es größer als die Länge der Zeichenfolge ist. Sie können das Flag -Wsign-compare
in gcc
und einige andere Compiler verwenden, um Sie zu warnen, wenn Sie versuchen, signierte und unsignierte Werte zu vergleichen.
Auch macht es wenig Sinn, die Länge einer Zeichenkette mit -1
zu vergleichen. Eine Länge kann niemals negativ sein; es ist immer gehen 0
oder größer sein. Sie werden also wahrscheinlich Ihren Code neu schreiben müssen, um ihn gegen 0
zu testen, oder Sie können die Bedingungen, die Sie testen möchten, auf andere Weise korrekt implementieren.
if(-1<strlen(str)) printf("The size of the string is %d", strlen(str));
In diesem Code kann man vernünftigerweise den Test immer erwarten, dass um erfolgreich zu sein und die printf()
auszuführen, da die Länge immer 0
oder mehr ist. Aber Sie finden, dass der Test tatsächlich fehlschlägt und die printf()
nie passiert, weil -1
zu einem unsigned heraufgestuft wird, so dass es mit einem size_t
verglichen werden kann. Die einfache Lösung ist, den Zustand vollständig zu entfernen: Sie wissen, dass der Test immer erfolgreich sein wird, also ist es nicht nötig. Entfernen Sie einfach die if
*:
printf("The size of the string is %zu", strlen(str));
* Auch das Spezifikationsdruckformat von %d
zu %zu
da ändern, wie Matt McNabb in einem Kommentar darauf hingewiesen, sie ist ein size_t
Versuch zu drucken.
Was ist der Ausgabewert von 'strlen (str)'? – sasquatch
Könnte sein, dass es unsigned Wert zurückgibt und das Dinge bricht –
es ist gut, Warnungen zu maximalen Einstellungen auf Ihrem Compiler zu aktivieren –