2013-03-15 2 views
1

В основном я пытаюсь получить строку от пользователя в форме: 3 + 2, как одна строка, проверить компоненты строки индивидуально и выполнить расчет. У меня уже есть программа калькулятора, работающая с вводом командной строки, но мне нужно получить и прочитать строковый ввод от пользователя, если они не используют командную строкучтение строки ввода для калькулятора в C

Это то, что у меня есть до сих пор. Пожалуйста 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"); 
} 
+2

Во-первых, вы должны использовать [ 'fgets'] (http://en.cppreference.com/w/c/io/fgets), чтобы получить строку ввода от пользователя Во-вторых, вся строка завершено '' \ 0'', а не каждое «слово» в строке. В-третьих, найдите функцию ['strtok'] (http://en.cppreference.com/w/c/string/byte/strtok), чтобы разделить строку на разделителе. В пункте четыре вы пытаетесь присвоить строку (например, 'argv [1]') символу ('s [i]'). И, наконец, вы можете фактически использовать 'sscanf' в строке, которую вы читаете напрямую, не нужно разделить ее. –

+0

'но мне нужно получить и прочитать строковый ввод от пользователя, если они не используют командную строку' - так что же это конкретно ваша проблема? – Mike

+0

с использованием соответствующих строковых функций и обеспечения работы с калькулятором – user2173788

ответ

2

Прежде, вы должны использовать fgets прочитать данные, как gets уязвима к переполнению буфера:

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

Тогда вы можете просто использовать sscanf, чтобы получить необходимые вам данные необходимо:.

sscanf(s, "%d %c %d", &num1, &operator, &num2);