2015-01-11 4 views
0

두 개의 숫자를 더하고 플로트로 출력하는 프로그램을 실행하려고합니다. 예를 들어C에서 float 캐스팅에 대한 도움말

: 저를 ./mc $ + 1 2.3

내가 가진 것을 나 3.3 여기

3.3000이다 $ 생산해야합니다

#include <stdio.h> 

int main(int ac, char* args[]) 
{ 
    float sum=0; 
    if ((strcmp(args[1],"+")) == 0) 
    { 
     sum=atof(args[2])+atof(args[3]); 
     printf("%f\n", sum); 
    } 
    else 
     printf("exit"); 
    return 0; 
} 
+3

'main '의 두 매개 변수에 대한 일반적인 이름은'argc'와'argv'입니다. 이러한 이름을 사용하면 코드를 더 쉽게 읽을 수 있습니다. –

+0

당신은 문제가 무엇인지 말하지 않았습니다. –

+0

@KeithThompson : OP의 [이전 질문] (http://stackoverflow.com/questions/27884998/help-with-basic-programming#comment44171344_27884998)에 대한 언급에서 'argc'및 'argv' 이 프로그램은 ... –

답변

0

대신 strtod를 사용해야합니다

#include <stdio.h> 
#include <stdlib.h> 

void usage(const char *const program) 
{ 
    fprintf(stderr, "usage: %s x y [where x and y are numbers.]\n", program); 
    return -1; 
} 

void conversionFailed(const char *const program) 
{ 
    fprintf(stderr, "arguments should be numbers\n"); 
    return usage(program); 
} 

int main(int ac, char* args[]) 
{ 
    float sum; 
    char *endptr; 

    if (ac < 4) 
     return usage(argv[0]); 
    if (strcmp(argv[1], "+") == 0) 
    { 
     sum = strtod(args[2], &endptr); 
     if (*endptr != '\0') 
      return conversionFailed(argv[0]); 
     sum += strtod(args[3], &endptr); 
     if (*endptr != '\0') 
      return conversionFailed(argv[0]); 
     printf("%f\n", sum); 
    } 
    return 0; 
} 

입력 유효성 검사가 가능하기 때문에이 좋습니다.

+0

그는 사인을 확인하지 않고 있습니다. 그는 미래에 다른 연산자 (예 : "*", "-", "/"등)를 처리하기를 원하기 때문에이 경우 연산자를 확인합니다. –

+0

나는 프로그램 호출이'./mc 1 2.3'이 아니라고 생각했기 때문에 그 사실을 알지 못했습니다. 죄송합니다. 그래서 대답을 정정 한 것입니다. 적어도 나를 위해 선호되는 사용법,'strtod()'. 하지만 ** OP는 '쑤 딩 (Xu Ding)'의 대답을 피해야한다 ** 그는 그 문제를 해결하고 있기 때문이다. –

+0

'strtod '를 사용하면 더 나은 오류 검사가 가능하지만 문제는 아닙니다. 문제는 누락 된'#include '입니다. 다른 대답을 참조하십시오. –

6

stdlib.h을 포함해야합니다. 그렇지 않으면 atof의 내재적 정의는 int을 리턴합니다. @Keith 톰슨 언급 한 바와 같이

~$ man atof 
     1 ATOF(3)               Linux Programmer's Manual               ATO  1 F(3) 
     2 
     3 
     4 
     5 NAME 
     6  atof - convert a string to a double 
     7 
     8 SYNOPSIS 
     9  #include <stdlib.h> 
    10 
    11  double atof(const char *nptr); 

은, 이러한 문제를 방지하려면 : 당신은 컴파일러는이 같은 문제에 대해 당신에게 를 알 수 있도록 활성화 경고와 함께 컴파일해야

. gcc의 경우 -Wall -Wextra를 사용하고 가능하면 -std = ... -pedantic을 사용하십시오.

+1

더욱 중요한 것은 컴파일러가 이와 같은 문제에 대해 알려줄 수 있도록 경고를 사용하여 컴파일해야한다는 것입니다. 'gcc'의 경우'-Wall -Wextra'와'-std = ... -pedantic'을 사용하십시오. –

+0

@KeithThompson 좋은 조언. –

+0

자유롭게 답을 추가하십시오. –

관련 문제