我有以下的方法,在兩個字符串讀取更改數據庫中的兩個條目的姓和名。該名稱總是被轉換爲小寫字母,並且只能使用帶有字母或連字符的名稱,除非連字符是字符串中的第一個或最後一個字符。出現錯誤時,它只會再次提示用戶。在我的C代碼的邏輯錯誤
/*
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;
}
}
}
}
}
我已經找到了錯誤的線條與(!isalpha(buffer[i]) && buffer[i] != '-')
,但我不明白,爲什麼說法是錯誤的。
因此,舉例來說,一個成功的輸入可以是「約翰·史密斯」,或「坎洱辛普森」。在這兩種情況下,函數應該返回0(成功)。 如果輸入的是一樣的東西:「丹尼白」,「-Alexa雷德菲爾德」,「偉業」或「1234 5647」的功能應該只是重新開始(再次提示用戶)。 此刻,無論輸入什麼,功能都會重新開始。
請出示一個例子輸入,預期輸出和實際輸出。 –
如果沒有評論,很難說出這段代碼的哪些部分是有意做的。例如,爲什麼你測試'我'達到20?你認爲這是做什麼?你認爲最後這兩個'scanf'調用怎麼辦?這兩個「break」陳述的預期目的是什麼? –
我的不好,我會編輯帖子以添加更多評論。我檢查i == 20的原因是因爲我打算使用for循環來檢查字符串中的每個字符是不是字母或連字符。如果for循環成功運行,那麼它將在i = 20處停止,這意味着輸入沒有問題,並且可以返回0(表示方法成功)。 sscanf使第一個=緩衝區,最後=緩衝區2。 – Snow