2011-05-12 4 views
2

내 사용자 입력이 실제로 두 개의 요소와 개행 만 있는지 실제로 확인합니까?scanf 유효성 검사 C

char newline 
scanf(" %s %s%c", out, in, &newline); 
if(newline != '\n'){ 
    error(); 
} 
+0

테스트 해 보셨습니까? – karlphillip

+2

조심하십시오. 'out'과'in'은 사용자 타입에 관계없이 충분한 공간을 가질 필요가 있습니다. 아마도'% ns'을 사용해야 할 것입니다.'n'은'out' 또는''in''에 의해 가리키는 버퍼의 크기입니다. 그래서 버퍼가 12 바이트 길이라면,'% 11s'. – nmichaels

+0

[20] char out [20]에 char가 있습니다. 감사합니다. "% 20s % 20x" – Jono

답변

3

scanf()의 반송 상태를 확인해야합니다. 3을 반환하지 않으면 유효성 검사에 실패했습니다. 귀하의 수표는 두 개의 '단어'가 있음을 보장합니다 (아마도 약간의 공백이 선행 될 수 있습니다). 두 번째 단어 다음에 공백 문자를 사용할 수 없습니다. 유효성 검사가 실패 할 경우 나머지 줄을 먹어야 할 수도 있습니다. 줄 바꿈이있는 경우에는 newline이됩니다.

1

아니요! scanf 두 번째 문자열과 줄 바꿈 사이에 공백 문자가있는 경우 올바로 작동하지 않습니다. 그에 대한 getc()를 사용

scanf("%s%s", buf1, buf2); 
char newline = 0; 
while((newline = getc()) == ' ' || newline == '\t'); 
if(newline != '\n'){ 
    error(); 
} 

편집 :

이 공백을 후행 경우 추가.

1

네, 그게 효과가 있습니다. 그러나 입력이 정확하게 일치하는 경우에만 : word word<enter>.

사용자가 두 번째 단어와 사이의 공백을과 같이 입력하면 논리가 실패합니다.

char newline; 
char out[50]; 
char in[50]; 
scanf("%s %s%c", out, in, &newline); 
if(newline != '\n') 
{ 
    printf("error!"); 
} 

또한 scanf와 shouldn't 그런 입력에서 읽을 수. 입력을 읽으려면 fgets을 사용하고 데이터를 구문 분석하려면 strtok을 사용하십시오.