Как преодолеть сообщение об ошибке Windows перестала работать?

#c

#c

Вопрос:

Я пишу программу для простого калькулятора, который принимает строку (без пробелов) с двумя операторами и одним операндом и выводит результат. Моя программа компилируется просто отлично, но во время выполнения я получаю сообщение об ошибке Windows перестала работать. Что может быть причиной этого? Я думаю, что это хорошо связано с логикой моей программы. Вот мой код:

 #include <stdio.h>
#include <math.h>
int main()
{
    int operand_1 = 0, operand_2 = 0, i = 0, result = 0;
    char string[10], *ptr, operation;
    ptr = string;
    printf("Enter the expression:n");
    gets(string);
    //puts(string);
    while(*ptr==0||*ptr==1||*ptr==2||*ptr==3||*ptr==4||*ptr==5||*ptr==6||*ptr==7||*ptr==8||*ptr==9)
    {
        operand_1 = operand_1   ((int)*ptr)*pow(10,i);
        i  ;
        ptr  ;
    }
    operation = *ptr;
    ptr  ;
    i=0;
    while(ptr!=NULL)
    {
        operand_2 = operand_2   ((int)*ptr)*pow(10,i); 
        i  ;
        ptr  ;
    }
    switch(operation)
    {
        case ' ':
            result = operand_1   operand_2;
        case '-':
            result = operand_1   operand_2;
        case '*':
            result = operand_1 * operand_2;
        case '/':
            result = operand_1 / operand_2;
        case '%':
            result = operand_1 % operand_2;
    }
    printf("%d",result);
}
  

Комментарии:

1. Прежде всего — прекратите использование gets . Эта функция опасна и больше не является частью C

2. Во-вторых, ptr это указатель на string , но вы сравниваете его с числами.

3. Что вы имели while(ptr!=NULL) в виду while(*ptr!= 0) ?

4. «Перестал работать» обычно означает, что он застрял в бесконечном цикле. Узнайте с помощью отладчика, где вы застряли. Это очень важный навык. Помните, что «компилируется нормально» ничего не значит о том, насколько корректен ваш код.

5.Обратите внимание, что case операторы «проваливаются», поэтому вы должны break использовать каждый из них, иначе конечным результатом будет то, что вы будете запускать каждый из них для операции, подобной приведенной вверху.

Ответ №1:

Я решил проблему, а также улучшил логику программы, чтобы она работала нормально.

 #include <stdio.h>
#include <math.h>
int main()
{
while(1)
{
int operand_1 = 0, operand_2 = 0, i = 0, result = 0;
char string[10], *ptr, operation;
ptr = string;
printf("nEnter the expression:");
scanf("%s",string);
if (*ptr=='q' || *ptr=='Q' amp;amp; *(ptr 1)=='u' || *(ptr 1)=='U' amp;amp; *(ptr 2)=='i' || *(ptr 2)=='I' amp;amp; *(ptr 3)=='t' || *(ptr 3)=='T')
{
printf("nBye");
break;
}
while(*ptr>='0' amp;amp; *ptr<='9')
{
operand_1 = operand_1*10   (*ptr - 48);
i  ;
ptr  ;
}
operation = *ptr;
ptr  ;
i=0;
while(*ptr>='0' amp;amp; *ptr<='9')
{
operand_2 = operand_2*10   (*ptr-48);
i  ;
ptr  ;
}
if(operand_2 == 0)
{
printf("nDivision by zero");
continue;
}
switch(operation)
{
case ' ':
result = operand_1   operand_2;
break;
case '-':
result = operand_1 - operand_2;
break;
case '*':
result = operand_1 * operand_2;
break;
case '/':
result = operand_1 / operand_2;
break;
case '%':
result = operand_1 % operand_2;
break;
}
printf("nResult = %d",result);
}
}
  

Надеюсь, это поможет кому-то нуждающемуся 🙂

Комментарии:

1. Спасибо! Возможно, было бы полезно кратко объяснить, в чем заключалась проблема, а также исправить отступ вашего обновленного кода.