2017-02-05 2 views
0

Wenn ich eine Zeichenfolge mit mehr als Größe 10 eingeben, warum wird dann kein Kompilierzeitfehler generiert, wie ich str der Größe 10 deklariert habe? Zum Beispiel habe ich Eingabe welcome to the world, dann ist es kompilieren und läuft ohne Fehler.Programm, um die Länge einer Zeichenfolge zu finden

#include <stdio.h> 
#include <conio.h> 

int main() { 
    int i = 0, length; 
    char str[10]; 
    printf("enter string: "); 
    gets(str); 

    while (str[i] !='\0') { 
     i = i + 1; 
    } 
    length = i; 
    printf("the length of string is %d", length); 
} 
+1

Verwenden Sie 'gets()' nicht! Verwenden Sie stattdessen 'fgets()'. 'gets()' ist böse und wurde daher seit langem aus C entfernt. – alk

+1

"... ... warum wird kein Kompilierfehler generiert ... *" meinst du wahrscheinlich "Laufzeitfehler", nicht wahr? – alk

+1

Wie konnte es einen Kompilierzeitfehler erzeugen? Sie kompilieren Ihr Programm einmal und führen es auf unbestimmte Zeit aus. Erwarten Sie, dass der Compiler eine Kristallkugel überprüft, um festzustellen, ob jemand Ihrem Programm jemals eine zu große Linie geben wird? – StoryTeller

Antwort

1

Da gets keine Längenparameter nehmen Sie es nicht wissen, wie groß Ihre Eingangspuffer ist.

Sie fgets statt

1

Es ist ein undefinierten Verhalten verwenden können. Alles kann passieren.

Verwenden Sie niemals gets(), weil es Pufferüberlauf nicht verhindert, was Ihr Programm tut. Verwenden Sie fgets() anstelle von gets().

fgets() verhindern die Größe des Arrays darüber hinaus.

fgets(array, sizeOfArray, stdin); 
0

Da Sie die String-Länge als 10, so dass, wenn der Wert des Programms erhöht stoppt die Ausführung, außerdem haben Sie nicht Umgang mit Fehlermechanismus für den Code. Daraus ergibt sich der folgende Fehler, den Sie erwähnt haben. Verwenden Sie fgets

+1

_das Programm stoppt die Ausführung_ ... oder nicht, UB ist UB –

+0

Es sollte aufhören, –

+0

"* ... resultierend der folgende Fehler zu führen, den Sie erwähnten." "Welcher Fehler? – alk

5

Eine Eingabezeichenfolge ist eine Laufzeiteinheit. Jede Berechnung, die damit verbunden ist, kann nicht zur Kompilierungszeit durchgeführt werden. Daher sollten Sie einen Laufzeitfehler Fehler beheben.

Außerdem gets markiert ist in C99 veraltet und einfach von C11 entfernt, weil genau dieses unsicheren Verhalten nicht verhindert werden kann: ohne dass jemand beschweren, können Sie über Feldgrenzen schreiben, dieundefiniertes Verhalten ist. Verwenden Sie stattdessen fgets, was ein höheres Sicherheitsniveau bietet.

Verwandte Themen