Программа C зависает при запуске

#c #dev-c

Вопрос:

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

int main()
{
    int x1, x2, x3, 
        y1, y2, y3, 
        ystr1, ystr2, ystr3,  
        xstr1, xstr2, xstr3, 
        sstr1, sstr2, sstr3;

    printf("Insert.");
    scanf("%d%d%d%d%d%d", x1, y1, x2, y2, x3, y3);
    ystr1 = y2 - y1;
    xstr1 = x2 - x1;
    sstr1 = sqrt(pow(xstr1, 2)   pow(ystr1, 2));
    ystr2 = y3 - y2;
    xstr2 = x3 - x2;
    sstr2 = sqrt(pow(xstr2, 2)   pow(ystr2, 2));
    ystr3 = y3 - y1;
    xstr3 = x3 - x1;
    sstr3 = sqrt(pow(xstr1, 2)   pow(ystr1, 2));
    printf("Print %d, %d, %d", sstr1, sstr2, sstr3);
    return 0;
}
 

По какой-то причине этот код зависает каждый раз, когда я ввожу одну цифру. Я действительно не знаю, что может быть причиной этого. Это из-за слишком большого количества интов?

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

1. scanf("%d%d%d%d%d%d",x1,y1,x2,y2,x3,y3); ==> if (scanf("%d%d%d%d%d%d", amp;x1, amp;y1, amp;x2, amp;y2, amp;x3, amp;y3) != 6) exit(EXIT_FAILURE);

2. Откуда вы знаете, что он зависает, а не просто ждет дополнительной информации, так как вы сказали ему, что хотите большего? Кроме того, компилятор ни в коем случае не зависает, если вы можете запустить программу

3. Предложение: не используйте pow(X, 2) для целых чисел, предпочитайте X * X , возможно, заключенные в круглые скобки.

4. Никогда не используйте scanf для получения интерактивного ввода от пользователя.

5. Значит, здесь не холодно?

Ответ №1:

scanf Функция ожидает указателей в качестве аргументов, чтобы она могла изменять переменные, в которые вы читаете. Помните, что все аргументы в C передаются по значению. Если мы хотим что-то изменить с помощью функции, нам нужно передать ее адрес в память (указатель).

Это становится очевидным из предупреждений, которые генерирует ваш код, даже без включения явных предупреждений.

 test.c: In function ‘main’:
test.c:14:13: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘int’ [-Wformat=]
     scanf("%d%d%d%d%d%d", x1, y1, x2, y2, x3, y3);
            ~^
test.c:14:15: warning: format ‘%d’ expects argument of type ‘int *’, but argument 3 has type ‘int’ [-Wformat=]
     scanf("%d%d%d%d%d%d", x1, y1, x2, y2, x3, y3);
              ~^
test.c:14:17: warning: format ‘%d’ expects argument of type ‘int *’, but argument 4 has type ‘int’ [-Wformat=]
     scanf("%d%d%d%d%d%d", x1, y1, x2, y2, x3, y3);
                ~^
test.c:14:19: warning: format ‘%d’ expects argument of type ‘int *’, but argument 5 has type ‘int’ [-Wformat=]
     scanf("%d%d%d%d%d%d", x1, y1, x2, y2, x3, y3);
                  ~^
test.c:14:21: warning: format ‘%d’ expects argument of type ‘int *’, but argument 6 has type ‘int’ [-Wformat=]
     scanf("%d%d%d%d%d%d", x1, y1, x2, y2, x3, y3);
                    ~^
test.c:14:23: warning: format ‘%d’ expects argument of type ‘int *’, but argument 7 has type ‘int’ [-Wformat=]
     scanf("%d%d%d%d%d%d", x1, y1, x2, y2, x3, y3);
 

Так что вместо:

 scanf("%d%d%d%d%d%d", x1, y1, x2, y2, x3, y3);
 

Вы бы хотели написать:

 scanf("%d%d%d%d%d%d", amp;x1, amp;y1, amp;x2, amp;y2, amp;x3, amp;y3);
 

amp; Оператор возвращает адрес переменной.

Также важно отметить, что scanf возвращает int значение. Это значение указывает количество считанных значений. Вам, вероятно, следует проверить, что scanf("%d%d%d%d%d%d", amp;x1, amp;y1, amp;x2, amp;y2, amp;x3, amp;y3); возвращается 6 .

 if (scanf("%d%d%d%d%d%d", amp;x1, amp;y1, amp;x2, amp;y2, amp;x3, amp;y3) == 6) {
   ...
}
 

Еще одна вещь, которую вы, возможно, захотите сделать, — это установить начальные значения для ваших переменных. Если scanf это не удастся, у вас все равно будет это начальное значение.

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

1. Я не думаю, что это объясняет проблему «замораживания» операции. Однако OP не предоставил достаточной информации, чтобы ответить на эту часть вопроса, поэтому я все еще поддерживаю ответ.

2.@AndreasWenzel пропавший amp; может быть причиной замораживания или любого другого неправильного поведения. scanf() Функция может даже не return работать , так что это гораздо важнее, чем проверка количества успешных преобразований (для чего требуется, чтобы она возвращалась).

3. @WeatherVane: Да, вы правы, что пропажа amp; вызывает неопределенное поведение, поэтому это может быть причиной того, что что-то идет не так. Однако в этом случае я ожидал бы сообщения об ошибке «ошибка сегментации» или «нарушение доступа», а не просто замораживания. Поэтому я сильно подозреваю, что ОП не упоминает важные детали.

4. @AndreasWenzel возможно, но не в том случае, если нет операционной системы.

5. @WeatherVane, на уровне опыта операции я думаю, что мы можем отнести эту возможность к категории «вне шансов».