String-Länge
-
rkhb schrieb:
Aha. Und? Außerdem stimmt es nicht:
Du hast keine Ahnung, wovon du redest.
rkhb schrieb:
Das heißt: Das Array wird angelegt und sukzessive soweit gefüllt, wie Platz ist. Deswegen geben GCC und MSVC auch "nur" eine Warnung heraus.
Standardgemäß müssen Compiler nur bei constraint-Verletzungen und Syntaxfehler melden, d.h. also nicht bei UB; von "nur Warnungen statt Fehler" auf definiertes Verhalten zu schließen ist schlichtweg Unsinn, zumal der Standard solcherlei Abstufungen der Meldungen überhaupt nicht vorsieht.
Außerdem hast du nicht weitergelesen im (Standard)Draft, da heißt es nämlich noch "Characters from the array are written up to (but not including) a terminating null character
", und das offenbart ganz eindeutig deine String-Definition bei anschließender Verwendung in printf als UB. Wenn man schon liest und zitiert, dann vollständig und nicht sinnentstellend, aber das kannst du auch nicht.rkhb schrieb:
%d: "The int argument is converted to signed decimal in the style [−]dddd." (aaO. S. 277).
%d ist für size_t UB, da hast du auch schon wieder falsch gelesen. Die default argument promotion wandelt auf signed int, size_t ist aber immer als unsigned integral type definiert, die passen also nie zusammen:
"If a conversion specification is invalid, the behavior in undefined
".rkhb schrieb:
Nun gut, dem C99-Standard zuliebe hätte ich %zd schreiben müssen, aber das hätte der MSVC im C-Modus nicht geschluckt.
Für C99 heißt es für size_t %zu und nicht falsch wie bei dir %zd, was für signed Typen der gleichen Größe wie size_t definiert ist und nicht für size_t selbst.
rkhb schrieb:
Ich wollte dem OP nur schnell
Ja das ist die Krux der Google-Generation, nur eben schnell mal suchen, und wenn die Top 3 Antworten nicht sofort die Lösungen liefern, heißt es gleich: "im Internet steht nichts, also kann es auch nicht sein..."
-
Danke für die Hilfe!
Ich habe jetzt versucht Ralphs code bisschen zu modifizieren damit ich selbst den string eingeben kann.
#include <stdio.h> #include <string.h> #define BUFLEN 100 #define NO_STRING -1 int string_len(const char s[], int buf_len) { int i; for (i=0; i<buf_len; ++i) { if (s[i] == '\0') return i; } return NO_STRING; } int main( void ) { char string[BUFLEN]; size_t strlen_laenge; int string_len_laenge; printf("String eingeben:"); fgets(string,100,stdin); string_len_laenge = string_len (string,BUFLEN); if (string_len_laenge < 0) { puts("Der String ist gar kein String"); } else { printf("Der String \"%s\" hat %d Zeichen\n",string, string_len_laenge); } return 0; }
Nun zeigt er mir aber leider eine Stelle zu viel an. Wird jetzt etwa die null am Ende mitgezählt?
-
R231SL schrieb:
Nun zeigt er mir aber leider eine Stelle zu viel an. Wird jetzt etwa die null am Ende mitgezählt?
Nein, die Null wird nicht mit gezählt, aber das '\n' von der Entertaste.
Das kannst du auch daran erkennen, das die Ausgabe " hat ... Zeichen" in einer neuen Zeile steht.
Steht auch so in der Referenz zu fgets.Und ersetze die 100 bei fgets durch dein BUFLEN.