1

基本的に、私はユーザーから次の形式の文字列を取得しようとしています:3 + 2、単一の文字列として、文字列のコンポーネントを個別にチェックし、計算を行います。私はすでに電卓プログラムをコマンドライン入力で動作させていますが、ユーザーがコマンドラインを使用しない場合は、ユーザーから文字列入力を取得して読み取る必要があります

これは私がこれまでに持っているものです。hellpppしてください:(

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



int main(int argc, char *argv[]) {
int num1, num2;
float ans;
char operator;
int i = 0, j = 0;
char s[100] = " ";
char s1[100], s2[100];




if (argc==4) {
sscanf(argv[1], "%d", &num1);
sscanf(argv[2], "%c", &operator);
sscanf(argv[3], "%d", &num2);

switch (operator) {
  case '+': ans = num1+num2;
    printf("%d %c %d = %.2f\n", num1, operator, num2, ans);
        break;
  case '-': ans = num1-num2;
    printf("%d %c %d = %.2f\n", num1, operator, num2, ans);
        break;
  case 'x':
  case 'X': ans = num1*num2;
        printf("%d %c %d = %.2f\n", num1, operator, num2, ans);
            break;
  case '^': ans = pow(num1, num2);
            printf("%d %c %d = %.2f\n", num1, operator, num2, ans);
            break;

  case '/': if (num2 == 0) {
      printf("Error! Division by Zero!\n");
    }
    else {
      ans = num1/num2;
      printf("%d %c %d = %.2f\n", num1, operator, num2, ans);
    }           
        break;
  default: printf("%c is not a valid operator!\n", operator);
  }}
 else
 if (argc==3) {
sscanf(argv[1], "%c", &operator);
sscanf(argv[2], "%d", &num1);

switch (operator) {
  case 'n':
  case 'N': ans = -num1;
        printf("-(%d) = %.2f\n", num1, ans);
        break;
  case 'a':
  case 'A': ans = fabs(num1);
        printf("|%d| = %.2f\n", num1, ans);
    break;


  case 's':
  case 'S': if (num1 < 0) {
      printf("Can't find square root of negative number\n");
    }
    else {
      ans = sqrt(num1);
      printf("Sqrt(%d) = %.2f\n", num1, ans);
    }
        break;
  default: printf("%c is not a valid operator!\n", operator);
} }

else if ((argc!=3) || (argc!=4)) {

printf("Enter the string you want to calculate: ");
gets(s);




while (s[i] != '\0') {

s[i] = argv[1];

i++;

} 

 while 
(s[i] != '\0') {

s[i] = argv[2];

i++;

}
 while 
 (s[i] != '\0') {

 s[i] = argv[3];

 i++;

 }}

}
else 
printf("Input Error!!!\n");
}
4

1 に答える 1

2

まず、バッファ オーバーフローに対して脆弱fgetsであるため、入力を読み取るために を使用する必要があります。gets

fgets(s, sizeof(s), stdin);

次にsscanf、必要なデータを取得するために単純に使用できます。

sscanf(s, "%d %c %d", &num1, &operator, &num2);
于 2013-03-15T12:10:33.673 に答える