2017-01-28 1 views
3

내가 커맨드 입력을 검증하기 위해 sscanf를()를 사용하기 위해 노력하고있어C의 sscanf를() 강제 번호 입력

I, 1, 0.1, 0.111이 통과하는 같은에만 일을 할 하지 A12 12A 또는 1.2A

나는

if (sscanf(input, "%f", &val) != 1) { // to check for 1 successful conversion 
     printf("invalid input"); 
} 

을 시도하지만 유효하지 않은 입력뿐만 아니라 통과시키는 것 같은 것 같습니다.

어떤 조언이 필요합니까?

+2

'scanf()'를 두 번 호출하지 마십시오. 'if()'는 첫 번째 검사가 성공했는지 여부를 검사하지 않고 두 번째 검사를 수행하고 있습니다. – Barmar

+0

실제로 내 코드가 어떻게 보이는지는 아닙니다. 나는 다만 독자가 이해할 것을 돕고 싶었다.나는 두 번째 줄만 가지고있다. – namesake22

+3

분명히 이해가되지 않았다. 실제 코드, 원하는 결과 및 대신 얻는 결과를 게시하십시오. – Barmar

답변

2

sscanf(input, "%f", &var) 입력이 12a 또는 1.2a 인 경우 유효하지 않은 입력 부분에서 멈추고 나머지 문자는 후속 형식 코드로 읽을 수 있도록 남겨 둡니다.

  • 1.0 2.0 (공간)
  • 1.0, 2.0 (쉼표)
  • 1.0a 2.0 (편지)
  • :

    다음과 같은 문자열이 유효한 숫자 다음 부동 소수점 숫자에 대한 잘못된 문자가 있는지 고려

공백 및 쉼표는 인간 파싱 엔진에서 정상적으로 보입니다. 잘못된 문자가 발견되면 시스템 부동 소수점 구문 분석이 단순히 중지됩니다 (휴먼 허용 영역 또는 쉼표 또는 추한 문자).

n = sscanf(input, "%f%c", &var, &ch); 
if (n == 1 || 
    (n == 2 && (ch == ' ' || ch == ',' || ...))) { 
    // ... 
} 
+2

왜 아래 표를 보냈습니까? 아래 표는 괜찮지 만, 제발, 이유를 말해봐. – AJNeufeld

+0

나는 누가 투표를했는지 확실하지 않다. 만약 내가 부유물 앞에서 쓰레기를보고 싶다면 어떻게해야 할까? – namesake22

+1

'float '이전의 쓰레기는'% f' 변환이 성공하지 못하게하고'sscanf'는 0을 반환합니다. – AJNeufeld

1

sscanf 여기, 당신의 친구되지 않습니다 : 당신은 부동 소수점 숫자가 바로 쓰레기 뒤에되지 않도록하려면

, 당신은 같은 것을 사용할 수 있습니다. 에 대한 결과를 확인해도 하나의 전체 인수를 성공적으로 읽었음에도 실제로는 은 입력이 의미있는 의미로 유효 함을 보장하지 않습니다.

처럼

주어진 입력하십시오 %f 분석 중지 (그러나 성공) 첫 1, 을 읽은 후 다음과 같은 !에서 읽기 포인터를 떠나

1!!!1!oneone! 

. 이것은 "유효 입력"을 고려하지 않을 수도 있습니다.

동일한 행에있는 내용이 모두 쓰레기로 간주되는 경우 scanf은 줄 바꿈과 개행을 구분하지 않으므로 이 어렵습니다. 아마 이런 식으로 뭔가를 시도 :이 번호 입력을 떠 나 있지 않은 경우

int main(int argc, char *argv[]) 
 
{ 
 

 
    float val; 
 
    char c; 
 
    if (sscanf(argv[1],"%f%c",&val,&c)!=1) 
 
    { 
 
     printf("invalid input"); 
 
    } 
 
    return 0; 
 
}
지금은 모든 커맨드 입력 유효성을 검사합니다.