데이터베이스의 두 항목의 성과 이름을 변경하기 위해 두 문자열을 읽는 다음과 같은 방법이 있습니다. 이름은 항상 소문자로 변환되며 하이픈이 문자열의 첫 번째 또는 마지막 문자가 아닌 경우 문자 또는 하이픈이있는 이름 만 가져야합니다. 오류가 발생하면 사용자에게 다시 묻습니다.내 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"또는 "hom-er simpson"이 될 수 있습니다. 이 두 경우 모두 함수는 0 (성공)을 반환해야합니다. 입력 내용이 "Denny 's White", "-alexa redfield", "albert"또는 "1234 5647"인 경우 함수를 다시 시작해야합니다 (사용자에게 다시 묻습니다). 현재 입력에 관계없이 함수가 다시 시작됩니다.
는 예를 들어 입력, 의도 된 출력과 실제 출력을 보여주십시오. –
주석이 없으면이 코드의 어떤 부분을 의도하는지 알기가 정말 어렵습니다. 예를 들어'i'가 20에 도달하면 테스트하는 이유는 무엇입니까? 그게 뭐라고 생각하니? 그리고 마지막 두 번의 scanf 호출이 어떻게 생각하십니까? 두 개의 'break'문장의 의도 된 목적은 무엇입니까? –
내 나쁜, 더 많은 의견을 추가하려면 게시물을 편집합니다. 문자열의 각 문자가 문자 또는 하이픈이 아닌지 확인하기 위해 for 루프를 사용했기 때문에 i == 20인지 확인합니다. for 루프가 성공적으로 실행되면 i = 20에서 멈추고 입력에 문제가 없으며 0을 반환 할 수 있습니다 (이는 메서드가 성공했음을 의미 함). sscanf는 첫 번째 = 버퍼로, last = buffer2로 만듭니다. – Snow