Sie haben das genaue Problem mit scanf() und% s gefunden - was passiert, wenn Sie nicht wissen, wie viel Input es gibt?
Wenn Sie versuchen, char mystring[0];
ausführen, wird Ihr Programm problemlos kompilieren. Aber du wirst immer segfault. Sie erstellen ein Array der Größe 0, wenn Sie also versuchen, etwas in das Array zu platzieren, werden Sie sofort die Grenzen für Ihre Zeichenfolge verlassen (da kein Speicher zugewiesen wurde) - was ein segfault ist.
Also, Punkt 1: Sie sollten immer eine Größe für Ihre Zeichenfolge zuordnen. Ich kann an sehr wenige Umstände denken (okay, keine), wo Sie lieber char mystring[0]
statt char *mystring
sagen würden.
Als nächstes, wenn Sie scanf verwenden, möchten Sie nie den "% s" -Spezifikator verwenden - weil dies keine Grenzen - Überprüfung der Größe der Zeichenfolge. so dass selbst wenn Sie haben:
char mystring[512];
scanf("%s", mystring);
wenn der Benutzer mehr als 511 Zeichen eingibt (da die 512. \ 0 ist), werden Sie außerhalb der Grenzen Ihres Arrays gehen.Die Art und Weise, dies zu beheben ist:
scanf("%511s", mystring);
Das alles ist zu sagen, dass C nicht über eine Einrichtung, um automatisch eine Zeichenfolge der Größe, wenn es mehr eingegeben wird, als Sie erwarten. Das müssen Sie manuell tun.
Eine Möglichkeit, damit umzugehen, ist die Verwendung von fgets().
Sie sagen konnte:
while (fgets(mystring, 512, stdin))
{
/* process input */
}
Sie dann sscanf() verwenden, können mystring
Versuchen Sie den obigen Code, mit einem String der Länge 5. Nach 4 Zeichen zu analysieren gelesen wurden, dass Code Schleifen erneut, um den Rest der Eingabe abzurufen. "Verarbeitung" könnte Code enthalten, um einen String einer größeren Größe zuzuordnen und dann die neueste Eingabe von fgets() anzufügen.
Der obige Code ist nicht perfekt - er würde Ihr Programm eine Schleife machen und eine unendliche Stringlänge verarbeiten, also möchten Sie vielleicht eine interne harte Grenze dafür haben (zB loop maximal 10 mal).
t sollte hinzugefügt werden, dass% s Wörter, nicht ganze Strings liest. Da die scanf-Formatzeichenfolge Leerzeichen und Zeilenumbrüche als Trennzeichen verwendet.In diesem Fall verwenden Sie stattdessen% c (mit einer Feldbreite) oder fgets wie bereits erwähnt. Denken Sie bei% c mit einer Feldbreite daran, die gesamte Pufferzeichenfolge auf Null zu initialisieren. –
Das Programm wird nicht immer segfault. In der Tat, wahrscheinlich nicht die meiste Zeit. Ihr Programm wird wahrscheinlich nur lautlos unterbrochen. Ist nicht C schön? :-) –