Scanf не будет сканировать внутренние данные Struct - PullRequest
0 голосов
/ 02 мая 2018

Мне нужна помощь!

Неважно, что я ввожу, я получаю тот же вывод, как будто программа не читает ввод от scanf, есть идеи?

Я попытался получить вход отдельно, чтобы разделить scanf, чтобы я получил 8 scanf. Но без удачи.

Если бы вы могли помочь мне и указать на то, что я делаю неправильно, я был бы признателен за это!

 struct point{
  double x;
  double y;
 }pt1,pt2,pt3,pt4;

 struct rect{
      struct point pt1;
      struct point pt2;
      struct point pt3;
      struct point pt4;
 };

  int main()
 {
    struct rect new_screen={
       scanf("%f,%f",&new_screen.pt1.x,&new_screen.pt1.y),
       scanf("%f,%f",&new_screen.pt2.x,&new_screen.pt2.y),
       scanf("%f,%f",&new_screen.pt3.x,&new_screen.pt3.y),
       scanf("%f,%f",&new_screen.pt4.x,&new_screen.pt4.y),
    };
       printf("the middle between (%.2f,%.2f) and (%.2f,%.2f) is ",new_screen.pt1.x,new_screen.pt1.y,new_screen.pt3.x,new_screen.pt3.y);
       print_point(middle(new_screen.pt1,new_screen.pt3));
   return 0;
 }



    struct point middle(struct point pt1, struct point pt2)
    {
        struct point tmp = {((pt1.x+pt2.x)/2),((pt1.y+pt2.y)/2)};
        return tmp;
    }
    void print_point(struct point pt)
    {
        printf("(%.2f,%.2f)",pt.x,pt.y);
    }

     output 
     the middle between (2.00,2.00) and (0.00,0.00) is (1.00,1.00)

1 Ответ

0 голосов
/ 02 мая 2018

Это здесь инициализация ...

struct rect new_screen = {
   scanf("%f,%f",&new_screen.pt1.x,&new_screen.pt1.y),
   scanf("%f,%f",&new_screen.pt2.x,&new_screen.pt2.y),
   scanf("%f,%f",&new_screen.pt3.x,&new_screen.pt3.y),
   scanf("%f,%f",&new_screen.pt4.x,&new_screen.pt4.y),
};

... не делает то, что вы думаете, что делает. scanf возвращает одно целое число (обратитесь к его странице справочника, чтобы узнать значение возвращаемого значения), но ваша структура содержит поля struct point. Что в сумме дает 8 удвоений и 4 звонка на scanf. Из-за того, как инициализация работает в C, вы можете опустить фигурные скобки и инициализаторы для некоторых полей. Так что это печально допустимый код. Но он инициализирует только new_screen.pt1 и new_screen.pt2 (четыре вызова scanf инициализируют четыре двойных). То, что вы отсканировали в них, сразу же перезаписывается. Последние две точки не инициализируются скобками, поэтому их следует инициализировать нулями, снова перезаписывая все, что вы, возможно, отсканировали в них.

Короче говоря, если предположить, что все вызовы scanf не дают ошибок (и мы игнорируем проблему со спецификаторами формата), вы, по сути, написали это:

struct rect new_screen = {
  { 2, 2 },
  { 2, 2 },
  { 0, 0 },
  { 0, 0 }
};

Менее неправильная инициализация будет:

struct rect new_screen;
scanf("%lf,%lf",&new_screen.pt1.x,&new_screen.pt1.y);
scanf("%lf,%lf",&new_screen.pt2.x,&new_screen.pt2.y);
scanf("%lf,%lf",&new_screen.pt3.x,&new_screen.pt3.y);
scanf("%lf,%lf",&new_screen.pt4.x,&new_screen.pt4.y);

Он не проверяет, что scanf успешно (именно поэтому он всего лишь меньше неправильных ), но он не растопчет содержимое new_screen с возвращаемым значением scanf. Я также исправил спецификатор формата (вы использовали %f, но double переменные требуют %lf).

Вышеуказанные ошибки также свидетельствуют о том, насколько важно компилировать с включенными предупреждениями и устранять их. Например, когда я скомпилировал ваш код с gcc -pedantic-errors -Wall -Wextra, я получил следующие предупреждения:

warning: format '%f' expects argument of type 'float *', but argument 2 has type 'double *' [-Wformat=]
    scanf("%f,%f",&new_screen.pt1.x,&new_screen.pt1.y),

warning: missing braces around initializer [-Wmissing-braces]
    struct rect new_screen={

warning: missing initializer for field 'pt3' of 'struct rect' [-Wmissing-field-initializers]
    };

Привыкнуть к компиляции с включенными предупреждениями и обрабатывать их до тех пор, пока сборка не будет свободна от диагностики компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...