2012-08-27 3 views
2

이 포럼을 검색하고 있지만 검색하는 데는 여전히 문제가 있습니다. C에 대한 나의 이해는 여전히 매우 기본입니다. 저는 사용자가 입력 한 3 개의 수치 값을 취한 다음 가장 높은 수치를 계산하는 작은 프로그램을 만들고 있습니다. 나는 그것을 못 박았습니다.사용자가 입력 한 값이 숫자인지 확인하는 기본/수동 방법입니다.

이제 사용자가 정수 값만 입력하도록하고 싶습니다. 나는 prog이 특정 수치 범위 (예를 들어, 1에서 1000 사이의 숫자, 케이크 조각)까지 다시 입력하라는 메시지를 계속 표시하도록 관리했지만 충분하지는 않습니다. 각 while 루프를 사용하여 각 값을 테스트했지만 입력이 정수 유형 인 경우에만 작동합니다.

트릭은 내장 기능을 사용하지 않습니다. 그것은 수동 (미안, 가난한 단어 선택)해야합니다. char 변수를 사용하려고 x = getchar(); ASCII 값을 얻고 조건에서 테스트하지만 루프에서 작동하지는 않습니다. (while/do-while)

"for 루프"및 배열 변수를 사용해 보았지만 사용자에게 계속 묻는 데 어려움을 겪고 있습니다.

또한 scanf가 반환 한 값을 정수형이지만 올바른 C 구문의 지식 수준이 level : noob인지 테스트하려고했습니다. 내 루프가 루프되지 않거나 무한 루프됩니다. 여기

은 몇 가지 예제 코드입니다 :

int x, y, z =0; 

printf("Enter the first number:\n"); 
scanf("d", &x); 
while (condition) /* Here is where I need to determine that the entered val is false */ 
{ 
    printf("Wrong input. Re-enter a valid value.\n"); 
    x =0; 
    scanf("%d", &x); /*user re-prompted */ 
} 

내가 ASCII와 루프를 사용해야합니다 아이디어를 받고 있어요,하지만 난 그냥 그것을 얻을 수 없습니다. 또한 입력 된 값은 비교를 위해 함수로 전송 된 다음 반환됩니다.

누군가 나에게 조언을 해주고 몇 가지 팁을 제공해 주시겠습니까?

많은 감사

+0

대기, 그것은 수동 수있다? 그렇다면 어떻게'scanf'를 사용하여 파싱을 할 수 있습니까? 그건'atoi','strtol' 또는 그와 비슷한 것만 큼 다를 것입니다. –

+0

나는 scanf 만 사용하고있다. (고대예요, 사람들이 그것을 사용하지 않으려 함을 읽었습니다.)하지만 나는 아직 다른 문장들을 다루거나 이해하지 못했습니다. –

+0

"scanf()"는 여전히 유용한 도구입니다. 그리고이 경우, 자신의 버퍼를 할당하고 파싱하는 것이 중요합니다. 중요한 것은 반환 상태를 사용하여 scanf()의 내장 검증 메커니즘을 활용하는 것입니다. – paulsm4

답변

0

당신은 fgets 같은 것을 사용해야하고, strtol 것입니다 : 우리가 여기서하고있는 것은 그것을 구문 분석을 중지했던 우리가 우리에게 얘기를 strtol의 기능을 활용하는 것입니다

long someValue; 

char *bufEnd = NULL; 
char buf[128]; // max line size 

do { 
    printf("enter a value: "); 
    fgets(buf, 128, stdin); 
    someValue = strtol(buf, &bufEnd, 10); // base 10 
} while (bufEnd == buf || *bufEnd != '\n'); 

printf("got value: %li", someValue); 

, bufEnd을 전달합니다. 그런 다음

, 우리는 bufEndbuf의 시작 부분에 (이 경우, 그것은 숫자로 시작하지 않았다)를 가리 키지 않는 있는지 확인하고, 또한 그 bufEnd\n을 확인하기 위해 확인하거나된다 (사용자가 123abc과 같은 것을 입력하지 않도록하십시오. strtol123으로 해석됩니다). 그러나 먼저 공백 문자 buf을자를 수 있습니다.

0

"scanf()"로 올바른 길을 가고 있습니다. 그냥 반환 값을 확인하십시오. 예상 수치를 얻지 못하면 잘못된 입력이 발생합니다.

char found = FALSE; 
int ival; 
double x; 

while (!found) 
{ 
    printf("Please enter a valid integer: "); 
    if (scanf("%d", &ival) !=1) { 
     printf ("Invalid! Please re-enter!\n"); 
     continue; 
    } 
    printf("Please enter a valid floating point number: "); 
    if (scanf("%lf", &x) !=1) { 
     printf ("Invalid! Please re-enter!\n"); 
     continue; 
    } 
    found = TRUE; 
} 
+0

내가 말했듯이 나는 여전히 C와 멍청하다.하지만 나는이 코드를 대부분 이해하고있다. 설명해주십시오 : char found = FALSE, (! found) 및 bottom found = TRUE; ? –

+0

"char"는 "bool"의 구식 C입니다. 컴파일러가 지원하는 경우 "bool"을 대신 사용하십시오. "found"또는 "! found"는 분명해야합니다. 그리고 "TRUE"와 "FALSE"는 구식 #define입니다. 컴파일러가 괴롭히는 경우, 위의 두 줄을 추가하십시오 :'#define FALSE 0'과'#define TRUE (! FALSE)'. "scanf()"를 사용하는 것이 버퍼 안전하다는 것을 강조 할 가치가 있습니다 ... 왜냐하면 fgets() 등과 달리 버퍼를 필요로하지 않기 때문입니다. :) – paulsm4

0

여기 내 해결책이 있습니다. 버퍼 오버플로 및 직선에 대해 안전합니다.

#include <stdio.h> 
#define LEN 10 

int main() { 
    int a; 
    char str[LEN]; 
    fgets(str, LEN, stdin); 
    while (!sscanf(str, "%d", &a)) 
     fgets(str, 10, stdin); 
    printf("Num is : %d\n", a); 
    return 0; 
} 
0
#include <stdio.h> 
#include <limits.h> 
#include <ctype.h> 

int getInteger(int* err){ 
    int ch; 
    int n;//int32 
    int takeNum, sign; 
    long long int wk;//long long int as int64 

    wk=0LL; 
    *err = 0; 
    takeNum = 0;//flag 
    sign = 1;//minus:-1, other:1 
/* //skip space character 
    while(EOF!=(ch=getchar()) && (ch == ' ' || ch == '\t' || ch == '\n')); 
    ungetc(ch, stdin); 
*/ 
    while(EOF!=(ch=getchar())){ 
     if(ch == '-'){ 
      if(takeNum != 0){//in input number 
       *err = 1; 
       break; 
      } 
      if(sign == -1){//already sign 
       *err = 2; 
       break; 
      } 
      sign = -1; 
      continue; 
     } 
     if(ch >= '0' && ch <= '9'){//isdigit(ch) in ctype.h 
      if(takeNum == 0) 
       takeNum = 1; 
      wk = wk * 10 + (ch - '0')*sign; 
      if(INT_MAX < wk || INT_MIN > wk){//overflow 
       *err = 3; 
       break; 
      } 
      continue; 
     } 
     if(ch != '\n'){//input other [-0-9] 
      *err = 4; 
     } 
     break; 
    } 
    if(takeNum == 0){//not input number 
     *err = 5; 
    } else { 
     n=wk; 
    } 
    while(ch != '\n' && EOF!=(ch=getchar()));//skip to newline 
    return n; 
} 

int getValue(const char* redoprompt, int low, int high){ 
    int num, err=0; 

    while(1){ 
     num = getInteger(&err); 
     if(err || low > num || high < num) 
      printf("%s", redoprompt); 
     else 
      break; 
    } 
    return num; 
} 

#define max(x,y) ((x)>(y))? (x) : (y) 

int main(){ 
    const char *error_message = "Wrong input. Re-enter a valid value.\n"; 
    int x, y, z, max; 

    x = getValue(error_message, 1, 1000); 
    y = getValue(error_message, 1, 1000); 
    z = getValue(error_message, 1, 1000); 
    max = max(max(x,y), z); 
    printf("max:%d\n", max); 
    return 0; 
} 
관련 문제