Ich habe die folgende Methode, die in zwei Zeichenfolgen liest, um den Vor- und Nachnamen von zwei Einträgen in einer Datenbank zu ändern. Der Name wird immer in Kleinbuchstaben konvertiert und sollte nur Namen mit Buchstaben oder Bindestrichen enthalten, es sei denn, der Bindestrich ist das erste oder letzte Zeichen in der Zeichenfolge. Bei einem Fehler wird der Benutzer nur erneut aufgefordert.Logischer Fehler in meinem C-Code
/*
Prompts for a student name, and checks if input is correct.
Returns 0 on success, -1 onEOF.
If the user inputs an invalid entry, the error is ignored and the user is simply asked again.
*/
int get_name(char *first, char *last)
{
char input[LINESIZE];
char buffer[LINESIZE];
char buffer2[LINESIZE];
int i;
while (1)
{
printf("\n%s", "Enter the Student Name ");
if (!fgets(input, LINESIZE, stdin))
{
clearerr(stdin);
return -1;
}
if (sscanf(input, "%s %s", buffer, buffer2) == 2)
{
if (strlen(buffer) < 20 && strlen(buffer2) < 20 && strlen(buffer) >= 2 && strlen(buffer2) >= 2) /*checks to see if the length is at least 2, but less than 20*/
{
for (i = 0; i < 20; i++) /*checks every character on the string, converts it to lower and then checks if it's a letter or a hyphen, restarts if not.*/
{
if (isalpha(buffer[i]))
{
buffer[i] = tolower(buffer[i]);
}
if (isalpha(buffer2[i]))
{
buffer2[i] = tolower(buffer2[i]);
}
if (!isalpha(buffer[i]) && buffer[i] != '-')
{
break;
}
if (!isalpha(buffer2[i]) && buffer2[i] != '-')
{
break;
}
}
if (buffer[0] == '-' || buffer[(strlen(buffer) - 1)] == '-')
{
i = 0;
}
if (buffer2[0] == '-' || buffer2[(strlen(buffer2) - 1)] == '-')
{
i = 0;
}
if (i == 20)
{
sscanf(buffer, "%s", first);
sscanf(buffer2, "%s", last);
return 0;
}
}
}
}
}
Ich habe den Fehler auf die Linien mit (!isalpha(buffer[i]) && buffer[i] != '-')
aufgespürt, aber ich kann nicht herausfinden, warum die Aussage falsch ist.
So kann beispielsweise eine erfolgreiche Eingabe "John Smith" oder "Hom-er Simpson" sein. In beiden Fällen sollte die Funktion 0 (erfolgreich) zurückgeben. Wenn die Eingabe etwas wie: "Denny's White", "-alexa Redfield", "Albert" oder "1234 5647" ist, sollte die Funktion einfach von vorn beginnen (den Benutzer erneut auffordern). Im Moment, unabhängig von der Eingabe, beginnt die Funktion neu.
zeigen Sie einen Beispiel-Eingang, sollte Ausgang und tatsächliche Leistung. –
Ohne Kommentare ist es wirklich schwer zu sagen, welche Teile dieses Codes gemacht werden sollen. Warum testen Sie zum Beispiel, ob "i" 20 erreicht hat? Was denkst du macht das? Und was denkst du, was diese zwei "scanf" Anrufe am Ende tun? Was ist der beabsichtigte Zweck der beiden Break-Statements? –
meine schlechte, ich werde den Beitrag bearbeiten, um weitere Kommentare hinzuzufügen. Der Grund, warum ich überprüfe, ob i == 20 ist, weil ich die for-Schleife beabsichtigte zu überprüfen, ob jedes Zeichen in der Zeichenfolge kein Buchstabe oder Bindestrich ist. Wenn die for-Schleife erfolgreich ausgeführt wird, würde sie bei i = 20 stehen bleiben, was bedeutet, dass es keine Probleme mit der Eingabe gibt und 0 zurückgeben kann (was bedeutet, dass die Methode erfolgreich war). Der sscanf macht den ersten = Puffer und den letzten = Puffer2. – Snow