2015-04-20 5 views
0

Я кодирую калькулятор, который работает на cmd. Я в основном закончен для операций +, -, /, * и двух чисел, но у меня есть эта ошибка. Я искал эту ошибку, но все документы касаются функций файла. Я не использую функцию файла. но все же я получаю эту ошибку:ошибка времени выполнения: ошибка отладки не выполнена

Ошибка отладки не удалась! программа: ... все studio2012 .... файл: F: \ дд \ vctools \ crt_bld \ self_x86 \ элт \ SRT \ strtol.c линия: 94

выражение: НПТР = NULL

коды:

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

char define(char input[]); 
float math(int sayi[], char operation); 

void main() 
{ 
int sayi[100]; 
char input[100]; 
char inputCpy[100]; 
const char functions[] = "+,-,/,*"; 
char *token; 
char operation; 
float result; 
int i=1; 

printf("welcome to my simple cmd calculator!\n what do you want to know?\n"); 
scanf("%s", input); 
strcpy(inputCpy,input); 
token = strtok(input, functions); 
sayi[0]=atoi(token); 
while(token != NULL) 
{ 
    token = strtok(NULL, functions); 
    sayi[i]=atoi(token); 
    i++; 
} 
printf ("sayi1=%d sayi2=%d", sayi[0], sayi[1]); 
operation = define(inputCpy); 
printf("operation = %c\n", operation); 
result = math(sayi,operation); 
printf ("result = %.2f\n", result); 
system("pause"); 
} 

char define(char input[]) 
{ 
char operation; 
for (int i=0; i<strlen(input); i++) 
{ 
    if(!isdigit(input[i])) 
    { 
     operation = input[i]; 
     break; 
    } 
} 
return operation; 
} 

float math(int sayi[], char operation) 
{ 
float result=0; 
switch(operation) 
     { 
     case '+': 
      result = sayi[0]+sayi[1]; 
      break; 

     case '-': 
      result = sayi[0]-sayi[1]; 
      break; 

     case '*': 
      result = sayi[0]*sayi[1]; 
      break; 

     case '/': 
      if(sayi[1]!='0') 
       { 
       result = sayi[0]/sayi[1]; 
       } 
      else 
       { 
       printf ("wtf!! you can't divide by 0!"); 
       } 
      break; 
     default: 
      printf("did you mean \"i don't know maths\""); 
     } 
return result; 
} 
+0

перспективе. – solohane

ответ

0

Необходимо позвонить, token является NULL, прежде чем звонить atoi(token).

Изменение строки:

token = strtok(input, functions); 
sayi[0]=atoi(token); 
while(token != NULL) 
{ 
    token = strtok(NULL, functions); 
    sayi[i]=atoi(token); // token will eventually be NULL 
         // and you run into a problem here. 
    i++; 
} 

к: ошибка времени

token = strtok(input, functions); 
i = 0; 
while(token != NULL) 
{ 
    sayi[i]=atoi(token); 
    token = strtok(NULL, functions); 
    i++; 
} 
+0

спасибо, что это сработало, но все еще что-то не так. Я получаю номер [0] правильно, но число [1] неверно, почему? – solohane

+0

@osumatu, вы можете добавить строки для печати 'token' и' sayi [i] 'в цикле' while' для диагностики проблема. –

+0

ok решен. большое спасибо! :) – solohane

0
token = strtok(input, functions); 

вы должны проверить возвращаемое значение strtok в противном случае вы можете передать нулевой указатель atoi. То же самое позже в вашем коде с token = strtok(NULL, functions);

+0

штрих возвращает строку, не так ли? что я должен проверить? вы имеете в виду: if ((strtok (вход, функции)! = NULL)? – solohane

+0

@osumatu проверить страницу man 'strtok', что произойдет, если' strtok' не сможет найти токен? – ouah

Смежные вопросы