2015-01-12 4 views
0

저는 컴퓨터가 주어진 데이터 유형에 대한 입력을 얻는 방법에 대해 궁금해했습니다. 사용자가 입력 한 데이터 유형의 유형, 예를 들어, 주어진 입력이 char 또는 정수인지 또는 float인지 double인지 여부를 알고 싶습니다. 입력이 a 인 경우, 그 문자는 123이라면 문자 여야한다고 알려야합니다. 12.1이면 float 일 경우, 12.001이면 double 유형입니다. 어떤 C 코드 함수도이를 수행 할 수 있습니까?C에서 데이터 유형을 교차 확인하는 방법은 무엇입니까?

C 코딩, 주어진 단일 입력의 올바른 데이터 유형을 반환하는 함수. 또한 scanf()의 도움으로 이러한 의견을 얻도록 도와주세요.

+0

에 오신 것을 환영합니다 스택 오버플로 :

여기에 테스트하고 이러한 유형을 분석 할 수있는 작은 기능입니다! [둘러보기] (http://stackoverflow.com/tour)를 읽고 [질문하는 방법] (http://stackoverflow.com/help/how-to-ask)을 읽고 질문에서 우리가 기대하는 바를 배우십시오. 여기에서 우리는 _from-stratch_ 코딩 서비스를 제공하지 않는다는 점에 유의하십시오. :-) –

+0

'scanf'로 문자열을 가져온 다음 구문 분석을 통해 최상의 표현이 무엇인지 확인할 필요가 있습니다. 이 경우 구문 분석은 매우 간단합니다. 최소한의 명백한 가능한 형식에서 최소한의 형식으로 변환하려고 시도하십시오. –

+0

thankyou.Im, 문자열을 선언하고 if() 문을 사용하여 숫자에 대한 문자 또는 ASCI 코드로 파싱 한 다음 number 일 경우 for() 루프를 사용하여 char no.to int no.Then으로 변환합니다. 문자열 123을 정수 1 * 100 + 2 * 10 + 3으로 정확하게 변환 할 수 있습니다. 문자열에 문자 '.'가 포함되어 있으면 THEN 그럼 난 구멍 용어를 더블처럼 123.2000 곱하기 123.2000 deny와 같은 double로 변환 할 필요가있다. if (double (int (123.000)) = 123.000)와 같은 float 또는 int에 맞는지 확인한다. 정수형 . if (double (int (123.100)) = 123.1000) float 데이터 유형에 적합합니다. else()는 double입니다. –

답변

1

아니요, 그렇게하는 C 기능이 없습니다.

C는 정적으로 타입이 지정되어 있습니다. 하나의 변수에 사용자가 설명하는 것과 같이 실제 유형이 많은 값을 보유하는 기본 제공 방법은 없습니다. 따라서 기능이 있더라도 magicparse(), 어떤 유형으로 반환 할 것으로 기대하십니까?

물론 123.001이 반드시 double 일 필요는 없습니다. 규칙을 작성하고 표준 라이브러리가 미리 알고 호환 기능을 보유 할 것으로 기대하십니까?

사용자가 문자열을 읽고 (일반적으로 fgets()을 사용하여 안전한 방식으로 전체 줄을 읽은 다음) 해당 문자열을 검사 ("구문 분석") 할 코드를 작성하고 사용자가 생각한 데이터 유형을 결정하십시오. 예를 들어, C가 foo(12)을 입력하여 정수를 전달하는 방법에 유의하십시오. foo(12.0f)float이고 foo(12.0)double을 전달합니다. 이러한 규칙은 언어의 일부이지만 직접 작성해야합니다.

+0

그러나 struct value_variant {enum {T_INT, T_DBL, T_CHR} 유형을 구현하는 것이 완벽하게 가능합니다. 공용체 {int i; 부호없는 int ui; double dbl;} value;};'파서를 작성하면 가장 일치하는 유형을 결정하고 해당 구조를 반환합니다. 문자열은 물론 다른 짐승입니다. – datenwolf

+0

모자를 벗습니다. 고맙습니다. Im은 scanf() 문에서 % c 또는 % d 또는 % f를 코딩해야하는 대상을 입력하는 방법을 알지 못합니다. 이 프로그램은 입력 된 다른 데이터 유형에 대해 다른 방식으로 작동합니다. 어떤 데이터 형식에서 scanf() 문을 사용해야합니까? –

+0

메신저 문자열을 선언하고 if() 문을 사용하여 숫자에 대한 문자 또는 ASCI 코드로 구문 분석을 수행 한 다음 숫자 인 경우 char no.to int no로 변환합니다. for() 루프를 사용하면 정확한 문자열 123을 정수 1 * 100 + 2 * 10 + 3으로 변환하고 문자열에 문자 '.'가 포함 된 경우 THEN 그럼 난 구멍 용어를 더블처럼 123.2000 곱하기 123.2000 deny와 같은 double로 변환 할 필요가있다. if (double (int (123.000)) = 123.000)와 같은 float 또는 int에 맞는지 확인한다. 정수형 . if (double (int (123.100)) = 123.1000) float 데이터 유형에 적합합니다. else()는 double입니다. –

0

본인이 알고있는 한, 사용중인 데이터 유형의 유형을 반환하는 함수가 없습니다. 데이터 유형을 찾는 대신 sizeof()라는 inbuilt 함수를 사용하여 데이터 유형을 예측할 수 있습니다.이 함수는 데이터 유형을 추정 할 수있는 데이터 크기를 제공합니다.

+0

fuction은 불가능합니다. 그러나 char [] 배열로 사용자 입력을 받아 type과 같이 위상을 켤 수 있습니다. '없다'. 정수입니다 ..와 '.' 다음 float .., char 경우에만 다음 문자열 .. thats .. 나는 곧 게시 할 것입니다 .. 메신저하지만 완료 bluestack 나 공유를 중지 ... –

-1

질문 끝에 큰 힌트가 있습니다.이 경우 scanf()을 사용할 수 있습니다.

유형을 알 수없는 입력을 구문 분석하려면이를 문자 스트링으로 읽고 다른 메소드로 분석해야합니다. 값 집합은 doublefloat과 같이 나타낼 수 있음을 유의하십시오. 12.1float 또는 double으로 간주되는지 여부는 관례입니다. 두 가지 유형 모두 실제로이 값을 정확하게 나타냅니다. C 소스 코드에서 접미어 f 또는 F은 (또는 소수점이나 지수가없는 경우 정수)과 반대로 값이 float 인 컴파일러에 알리는 데 사용됩니다.

#include <ctype.h> 
#include <stdio.h> 

const char *tell_type(void) { 
    char buf[128]; 
    float f; 
    double d; 
    int i; 
    int n; 

    if (!fgets(buf, sizeof buf, stdin)) { 
     return "EOF"; 
    } 
    if (sscanf(buf, "%i%n", &i, &n) == 1) { 
     if (buf[i] == '\0' || isspace((unsigned char)buf[i]) 
      return "integer"; 
    } 
    if (sscanf(buf, "%lf%n", &d, &n) == 1) { 
     if (buf[n] == 's' || buf[n] == 'S') 
      return "float"; 
     else 
      return "double"; 
    } 
    return "char"; 
} 
관련 문제