2010-04-29 6 views
-2

입력 값 (123) -이 값은 정수이며, 유효입력 형식을 지정하는 방법에만 정수 값 동의

입력 값 1b23a이 -이 값이 나는 유효한 어떤 값을 검색하려면 어떻게

무효가되어, 아니?

#include <stdio.h> 
#include <conio.h> 
void main() 
{ 
    char str1[5],str2[5]; 
    int num,num1,i; 
    num=0; 
    clrscr(); 
    printf("Enter the Number "); 
    scanf("%s",str1); 
    for(i=0;str1[i]!='\0';i++) 
    { 
     if(str1[i]>=48&&str1[i]<=56) 
      num=num1*10+(str[i]-48); 
     else 
     { 
      printf("The value is invalid "); 
     } 
    } 
    printf("This Number is %d",num); 
    getch(); 
} 
+1

미안 해요, 음, 뭐? –

+0

저는 여러분이 다음과 같은 것을 생각합니다 : 입력 필드의 유효성을 검사하여 정수 만 accepct 할 수 있습니까? 즉, 123은 유효하고, 1b23a는 유효하지 않습니다. – Luis

+1

목표 C는 프로그래밍 언어 일뿐입니다. 여러분은 아마 Mac에서의 코코아 개발 또는 iPhone/iPad에서의 CocoaTouch 개발에 대해 이야기하고있는 것으로 의심됩니다. –

답변

0
#include<stdio.h> 
#include<conio.h> 
void main() 
{ 
char str1[5],str2[5]; 
int num,num1,i; 
num=0; 
clrscr(); 
printf("Enter the Number "); 
scanf("%s",str1); 
for(i=0;str1[i]!='\0';i++) 
if(str1[i]>=48&&str1[i]<=56) 
num=num1*10+(str[i]-48); 
else 
{ 
printf("The value is invalid "); 
} 
} 
printf("This Number is %d",num); 
getch(); 
} 
+2

질문에이 코드를 삽입했습니다. 이 답변을 삭제할 수 있습니다. – mouviciel

+0

반대로, 당신은 당신 자신의 질문에 절대적으로 대답 할 수 있습니다. 그리고 당신이 당신의 질문에 대답한다면, 당신은 당신의 질문에 그것을 넣어서는 안됩니다. 그것은 어딘가에 FAQ에 있습니다. – wds

1

this answer regarding use of strtol()를 참조하십시오

여기 내 코드입니다. 이어야하는 임의의 입력을 정수의 문자열 표현으로 변환하는 한편, 추가 분석을 위해 '가비지'바이트를 절약하는 안전한 방법입니다. 그것을 사용

, 코드는 다음과 같이 보일 것입니다 :

#include <stdio.h> 
#include <errno.h> 
#include <stdlib.h> 
#ifdef LINUX_VERSION 
#include <curses.h> 
#else 
#include <conio.h> 
#endif 

#define BUFF_SIZE 1024 

int main(void) 
{ 
    char str1[BUFF_SIZE], *garbage = NULL; 
    long num = 0; 

    printf("Enter the Number "); 
    scanf("%s",str1); 

    errno = 0; 

    num = strtol(str1, &garbage, 0); 
    if (errno) { 
     printf("The number is invalid\n"); 
     return 1; 
    } 

    printf("You entered the number %ld\n", num); 
    if (garbage != NULL) { 
     printf("Additional garbage that was ignored is '%s'\n", garbage); 
    } 
    getch(); 
    return 0; 
} 

이것은 당신이 무엇을 게시에 대한 의문의 여지가 모든 것을 해결하지 않지만, 당신이 더 나은 출발을 얻을 도움이 될 것입니다.

출력은 다음과 같습니다

[email protected]:~$ ./t 
Enter the Number 1234abdc 
You entered the number 1234 
Additional garbage that was ignored is 'abdc' 

을 통해 컴파일 :

gcc -Wall -DLINUX_VERSION -o t t.c -lcurses 

난 당신이 사용하는 어떤 플랫폼, 코드에 이렇게 추가 수정이 필요할 수 있습니다 모르겠어요.

-1

한 가지 방법은 sscanf을 사용하고 숫자 뒤에 문자가 없는지 확인하는 것입니다. 이것은 다음과 같이 끝 부분에 %c을 추가하고 반환 코드를 테스트하여 가장 쉽게 수행됩니다

const char *yourString = ...; 
int theValue, dummy; 
if (sscanf(yourString, "%d%c", &theValue, &dummy) == 1) { 
    // Was a pure number, parsed into 'theValue' 
} else { 
    // Either no number or had junk after it 
} 
+0

sscanf를 사용하는 것에 대해 진지하게 권장합니다. 정말. "sscanf crash"를 검색하고 반환 된 모든 페이지를보십시오. "GNU C 프로그래밍 자습서"(http://crasseux.com/books/ctutorial/index.html)는 "sscanf 함수는 사용되지 않는 부모 scanf 함수와 비슷합니다. scanf 함수는 다음과 같이 위험한 것으로 간주됩니다. 여러 가지 이유가 있습니다. " 사용하지 마십시오. – hlovdal

+0

@hlovdal : 당신은 무능력합니다. 나는'scanf'를 권장하지 않고'sscanf'를 추천했다. (문자열 파싱이없고, 정확히 쌍을 이루는 형식 문자열과 변수들도) 다루는 경우는 안전하다. 실제로, 게시 한 링크를 읽으 려한다면 * sscanf를 사용하는 것이 좋습니다.(버퍼 오버 플로우를 방지하는 것은 간단합니다. 문자열의 크기를 제한 할 수 있습니다. 사람들이 형식을 직접 지정하게하는 것은 항상 불만입니다.) –

+0

http://crasseux.com/books/ctutorial/Formatted-string-input.html을 인용합니다. 내가 말한 것을 증명하는 자습서에서. –

관련 문제