#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, на уровне опыта операции я думаю, что мы можем отнести эту возможность к категории «вне шансов».