2013-03-19 1 views
4

안녕하세요, 저는 프로그래밍에 익숙하지 않고 잠시 동안 계산기로 작업 해 왔습니다. 일부 삼각 함수를 추가하려고하는데 사인과 문제가 있습니다. 다른 함수는 (+, -, *, /) 작동하지만 "sine"을 넣을 때 잘못된 함수라고 말하는 부분으로 건너 뜁니다. 제발 도와주세요. 감사! 다중 문자 리터럴"사인"을 입력하면 C 계산기 프로그램에서 오류가 계속 발생합니까?

#include <stdio.h> 
#include <math.h> 


int main() 
{ 

    float firstnum, secondnum, angle, answer, pi; 
    char function, sine; 


    pi = atan(1.0)*4; 


    printf("\nHello and welcome to my calculator!\n"); 

    while(1) 
    {  

     printf("\nPlease input the function you would like to use. These include +, -, *, /, sine.\n");  
     scanf("%s", &function); 



     switch(function) 
     { 
      case '+': 
      printf("\nNow please input the two variables.\n"); 
      scanf("%f", &firstnum); 
      scanf("%f", &secondnum); 
      answer = firstnum+secondnum; 
      break; 

      case '-': 
      printf("\nNow please input the two variables.\n"); 
      scanf("%f", &firstnum); 
      scanf("%f", &secondnum); 
      answer = firstnum-secondnum; 
      break; 

      case '*': 
      printf("\nNow please input the two variables.\n"); 
      scanf("%f", &firstnum); 
      scanf("%f", &secondnum); 
      answer = firstnum*secondnum; 
      break; 

      case '/': 
      printf("\nNow please input the two variables.\n"); 
      scanf("%f", &firstnum); 
      scanf("%f", &secondnum); 
      answer = firstnum/secondnum; 
      break; 

      case 'sine': 
      printf("\nPlease enter the angle.\n"); 
      scanf("%f", &angle); 
      answer = sin(angle); 
      break; 



      default: printf("Sorry, that is an incorrect function. The only available choices are +, -, *, /, sine."); 
      break; 
     } 

     printf("Your answer is %f \n", answer); 
     printf("\nWhen you are ready to quit, simply press Ctrl + C or just hit the X button in the top right.\n"); 
    } 

    return 0; 
} 
+0

이 문제는 정수를 취하는'switch' 문과 관련이 있으며, 각각의 경우는 정수입니다. 단일 문자는 ASCII 값으로 표시 될 수 있습니다. 여러 문자가 더 까다 롭습니다. 불행히도 어떻게 처리되는지는 기억하지 못합니다. – Moshe

+2

왜 누군가가 이것을 얕보는지, 초심자는 죄가 아니라는 것을 확신하지 못합니다. 당신은 분명한 질문을하고 +1 –

+0

코드를 제공했습니다. C로 시작하는 프로그래밍을 배우는 것은 권장하지 않습니다. 파이썬에서 같은 프로그램을 고려하십시오 (코드의 양과 연산자 맵의 사용을 비교하십시오). http : // pastebin.com/ew6ps8mv – hdante

답변

6
'sine' 

. function은 단일 문자입니다. 그것은 정수 값은 switch 문에서 확인됩니다. 사용자가 시도하는 방식대로 sine과 일치하는 사용자의 단일 문자를 절대로 소비 할 수 없을 것입니다. 대신 문자열 (char*)을 읽으십시오.

C99 6.4.4.4p10 : "(예 : 'AB'), 또는 문자를 포함하거나 탈출 시퀀스 않는 하나 개 이상의 문자를 포함하는 정수 문자 상수의 값이 표준에서

싱글 바이트 실행 문자로 매핑되지 않습니다. 구현 정의입니다. "

+0

에드 감사합니다. 어디에서 어떻게이 "char *"문자열을 읽겠습니까? 미안 해요.이 질문이 아주 쉽습니다. –

+0

사실 Matt은 이미 scanf ("% s", ...)를 사용하여 문자열을 읽었습니다. 단 하나의 문자로 두는 것은 단일 문자'function' 다음에 메모리를 덮어 쓰며 메모리를 손상시키고 아마도 버퍼 오버플로 실행 공격을 허용합니다 . – wich

+0

@wich : 와우, 나는 그걸 어떻게 든 두려워했다. 잘 했어. –

0

C에는 첫 번째 클래스 문자열 유형이 없습니다. 즉, 문자열에 대해 switch 문을 사용할 수 없다는 것을 의미하므로 문자열 비교에 strlcmp와 같은 함수를 사용해야합니다.

당신의 목적에 따라 (계산기를 만들거나 C를 배우는 것) 더 높은 추상화 수준을 가진 다른 언어로 전환하거나 좋은 C 교과서에서 낮은 수준의 연습으로 시작하는 것이 좋습니다.

또한 보안 구멍이없는 C에서 문자열과 사용자 입력을 올바르게 사용하는 것이 처음에는 훨씬 어려워집니다. 당신의 목적이 언어를 배우고 있다면 아마도 C++을 배우는 것이 비교를 처리하기 위해 std::string을 가지고 있고 입/출력을 처리하기 위해 iostreams을 가지고있는 것이 더 나은 선택 일 것입니다.

관련 문제