Schreiben Sie ein Programm, um zu überprüfen, gegebenen input-string balance-Klammern
Gegeben ein string von Klammern, ein Programm zu schreiben, um herauszufinden, ob Sie die gültigen oder nicht.
Beispiele-
input : {{{}}}
output: Valid
input : }{}{}{}}
output: Invalid
Schrieb ich den folgenden code in C und getestet, dass der Ausgang kamen korrigieren.
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[20];
int i=0;
printf("Enter String: ");
gets(str);
int count = 0;
while (str[i] != '\0')
{
if (str[i] == '}')
count--;
if (str[i] == '{')
count++;
if (count < 0)
{
printf("\nInvalid");
break;
}
i++;
}
if (count == 0)
printf("\nValid");
return 0;
}
Dieses Programm funktioniert nicht für den Fall, wo die Eingabe ist {{{}}
, welche Bedingung(en) fehlen mir?
- Verwenden Sie nicht
gets()
es gefährlich ist, ersetzen Sie es mitfgets(str, sizeof(str), stdin);
und vermeiden von buffer-overflow-Fehler. Und diese Seite ist nicht für die Arbeit code Fragen, ist es für Fragen der code, der Probleme hat, dein code ist gut, und es ist auch effizient genug. Das einzige, was falsch daran istgets()
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Code sollte festlegen, wenn das endgültige Ergebnis ist nicht 0 wie im Fall von
"{"
Einfach brechen aus der Schleife.
gets()
wurde, abgeschrieben seit C99 und beseitigt vonC
(C11), verwenden Siefgets()
.Gibt es keine Notwendigkeit, Lesen Sie die gesamte Zeichenfolge in. Code verwenden könnte 1
char
ar eine Zeit.Sie nicht wirklich brauchen, um input den ganzen string auf einmal, da Sie nur alle nacheinander die Verarbeitung der Zeichen. Somit können Sie vermeiden, mit unsicheren Methoden wie
gets()
- und auch sicher-aber-Sie erschweren Methoden wiefgets()
.Stattdessen verwenden Sie einfach
getchar()
zu Lesen und zu verarbeiten jede einzelne Charakter - das sollte erheblich vereinfachen, was Sie tun müssen.Als die Logik, haben Sie grundsätzlich Recht. Halten Sie die Klammer-Ebene, ein Wert, der zunächst auf null gesetzt. Lesen Sie dann jede Figur und Handlung wie folgt:
{
nur hinzufügen, um die Ebene.}
ist, zieht man aus der Ebene, dann überprüfen Sie, um sicherzustellen, das Niveau ist nicht-negativ. Wenn nicht, dann hatten Sie zu viele schließende Klammern, und Sie verlassen können.Siehe unten für ein Beispiel, wie diese umzusetzen ist:
Verwenden Sie niemals
gets()
, die gcc compiler selbst warnt davor, dass es gefährlich ist, weil es keine Möglichkeit gibt, zu verhindern, dass ein Pufferüberlauf, der zum Beispielmit der folgenden Eingabe
ist ein problem, denn dort ist kein Raum für die
'\0'
terminator oder die'\n'
stattwäre sicher mit eingeben, obwohl der input-string würde getrimmt werden, um die Puffer, aber kein Pufferüberlauf auftreten.
Bisherigen Antworten haben bedeckt Puffer-überläufe vermeiden und potenzielle Fälle, wo es nicht Arbeit - Verbesserung der Leistung, die ich ändern würde die while-Schleife zu vermeiden, überprüfen Bedingungen, die wir wissen, wird immer falsch sein. z.B. keinen Punkt in der Prüfung wenn die Zahl kleiner als 0 ist, es sei denn, wir haben gerade sank die Anzahl; keinen Punkt in der Prüfung für eine offene Klammer, wenn der Charakter war eine Klammer:
Ich hoffe, Sie finden diese nützliche und einfache ^-^