Ошибка в программе c в printf из-за% - PullRequest
0 голосов
/ 04 августа 2020

Я пишу свою первую c программу в Visual Studio и получаю очень основную c ошибку из-за спецификатора формата.

#include <stdio.h>
int main()
{
    int x,y;
    int area = x*y;
    printf("Enter the value of x  \n");
    scanf("%d", &x);

    printf("Enter the value of y  \n");
    scanf("%d", &y);

    printf("Area of the rectangle is %d\n", area);
    return 0;
}

ошибка: введите значение x 2 Введите значение y 1 Площадь прямоугольника -293795784 // Это ошибка. Я ожидаю выхода 2, т.е. произведения x и y. Не уверен, почему он принимает адрес значения вместо значения.

Ответы [ 3 ]

5 голосов
/ 04 августа 2020

Мы не можем найти область до инициализации x и y!

#include <stdio.h>
int main()
{
    int x,y;

    printf("Enter the value of x  \n");
    scanf("%d", &x);

    printf("Enter the value of y  \n");
    scanf("%d", &y);
    //Put this area formula here
    int area = x*y;
    printf("Area of the rectangle is %d\n", area);

    return 0;

}

Также вам нужно проверить возвращаемое значение из scanf. То есть - проверьте, что scanf действительно сканировал целое число. Другими словами: если вы хотите прочитать ровно 1 целое число, убедитесь, что scanf возвращает 1. Если нет, возникает ошибка.

Это выглядит примерно так:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int x,y;

    printf("Enter the value of x  \n");
    if (scanf("%d", &x) != 1)            // Notice this line
    {
        // Wrong input - stop program
        fprintf(stderr,"Input error - input must be a number\n");
        exit(1);
    };

    printf("Enter the value of y  \n");
    if (scanf("%d", &y) != 1)            // Notice this line
    {
        // Wrong input - stop program
        fprintf(stderr,"Input error - input must be a number\n");
        exit(1);
    };
    
    //Put this area formula here
    int area = x*y;
    printf("Area of the rectangle is %d\n", area);

    return 0;

}
0 голосов
/ 04 августа 2020

Вы определили область переменной перед вводом x и y, вместо этого вам также следует присвоить значение переменной области, равное x * y.

что вы сделали


int x,y;
int area= x*y; // you dont have the value of x and y yet //

поэтому после этого, если вы напечатаете значение области, оно фактически не имеет никакого значения.

что вы должны сделать, присвоив значение области после того, как у вас есть значения x и y.

Правильный путь


int x,y;

printf("Enter the value of x  \n");
    scanf("%d", &x);

    printf("Enter the value of y  \n");
    scanf("%d", &y);

int area=x*y; // now you have the value of x & y //
  
0 голосов
/ 04 августа 2020

Я все время борюсь с IDE, потому что мне нравятся пробелы и пустые строки, но без потерь. Я ставлю операнды, операторы в большинстве мест. Мне нравится НЕ закапывать лидерство в случае возврата вызова или во время его:

printf("Enter the value of x: ");

while ( 1 != scanf( "%d", &x )){
    fprintf( stderr, "Invalid x input, must be a number!\n" );
}

printf("Enter the value of y: ");

while ( 1 != scanf( "%d", &x )){
    fprintf( stderr, "Invalid y input, must be a number!\n" );
}

Это снижает утомляемость глаз для всех, делает ошибки более заметными, улучшает оценки и мнение начальника, сохраняет вертикальное пустое пространство. Укладываю один вкладыш, а все блоки стою отдельно. Я всегда делаю {}, если хочу добавить строки, например отладочные распечатки. Я редко говорю «else», предпочитая exit (), return, break, continue или использовать тернарный оператор в скобках для приоритета оператора: ( ? : ). Я стараюсь использовать переключатель, когда это возможно, для более чем двух результатов, так как это прекрасное место для размещения комментариев, например SQL CASE, без дополнительных отступов для случаев!

int retries = 0, ret ;
char buf[4096];

do {
    switch ( ret = read( fd, buf, sizeof( buf ))){
    case -1: // report error
        perror( "read(fd)" );
        exit( 1 );
    case 0: // nominal EOF; sockets, pipes return 0 for 0 length messages.
        if ( ++retries > 100 ){
            return 0 ; // assume normal EOF behavior for some function
        }

        continue ;
    default: // we read something
        retries = 0 ;
        break;
    }
} while ( ! ret );

// process the read() data

Конечно, мнения расходятся ! : D

...