私は、データベースの2つのエントリの姓と名を変更するために2つの文字列を読み込む次のメソッドを持っています。名前は常に小文字に変換され、ハイフンが文字列の最初または最後の文字でない限り、文字またはハイフンで名前を取得する必要があります。エラーが発生した場合、ユーザーに再度プロンプトが表示されます。私の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] != '-')
でラインにエラーを突き止めましたが、文が間違っている理由を私は理解することはできません。
たとえば、成功した入力は "john smith"または "homer er simpson"です。どちらの場合も、関数は0(成功)を返します。 入力が "Denny's White"、 "-alexa redfield"、 "albert"または "1234 5647"のようなものであれば、関数はちょうどやり直すべきです(ユーザーに再度プロンプトが表示される)。 現時点では、入力にかかわらず、関数はやり直します。
は、例えば、入力、意図された出力、および実際の出力を表示してください。 –
コメントがなければ、このコードのどの部分が意図されているかを知ることは本当に難しいです。たとえば、 'i'が20に達したのをなぜテストしていますか?何をしていると思いますか?そして、最後の二つの 'scanf'呼び出しはどうなると思いますか?二つの 'break'ステートメントの意図した目的は何ですか? –
私の悪い、私はコメントを追加するために投稿を編集します。文字列中の各文字が文字かハイフンでないかどうかをforループが調べることを意図していたため、私はi == 20かどうかを調べています。 forループが正常に実行されると、i = 20で停止し、入力に問題はなく、0が返されます(これはメソッドが成功したことを意味します)。 sscanfは、最初に=をバッファに、最後をbuffer2にします。 – Snow