我有以下的方法,在两个字符串读取更改数据库中的两个条目的姓和名。该名称总是被转换为小写字母,并且只能使用带有字母或连字符的名称,除非连字符是字符串中的第一个或最后一个字符。出现错误时,它只会再次提示用户。在我的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