переменная printf long меняет значение, если его число превышает 9 символов - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть этот простой код на C, всякий раз, когда я ввожу идентификационный номер, который длиннее 9 цифр, он печатает другой номер.Что не так?

void main() {
    long id1;
    double l1, w1;
    printf("enter studint 1 id,lenght and weight: \n");
    scanf("%ld %lf %lf", &id1, &l1, &w1);

    printf("STUDINTS INFORMATION:");
    printf("\n\n%-10.0ld\t %-4.3lf\t %-4.3lf\n", id1, l1, w1); 
}

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

Это потому, что диапазон long в C составляет от -2 147 483 648 до 2 147 483 647.Поэтому, когда вы пытаетесь сохранить число длиннее 9 цифр, оно выходит за пределы диапазона.

Для получения более подробной информации о диапазоне переменных в C: https://www.tutorialspoint.com/cprogramming/c_data_types.htm

0 голосов
/ 25 ноября 2018

Вы используете тип long для id1, который может иметь диапазон от -2147483647 до 2147483647 в зависимости от архитектуры целевой системы.Этот тип не может использоваться для хранения больших чисел в вашей системе.

Кстати, формат %-10.0ld для id1 кажется неправильным, поскольку вывод для значения 0 будет всего 10 пробелов.В поле precision указывается не количество десятичных знаков для целых чисел, а минимальное количество цифр.

Обратите также внимание, что main без аргументов должен иметь прототип int main(void), ивам следует проверить возвращаемое значение scanf(), чтобы избежать неопределенного поведения при неверном вводе.

Для решения вашей проблемы возможны следующие решения:

  • Вы можете использовать типdouble но я бы не советовал.

  • Вы можете попробовать набрать long long int, но этот тип может не полностью поддерживаться в вашей системе.

  • Я предлагаю вам использовать символьную строку для вашей цели.

Вот модифицированная версия:

#include <stdio.h>

int main(void) {
    char id1[20];
    double l1, w1;

    printf("enter student 1 id, height and weight:\n");
    if (scanf("%19s%lf%lf", id1, &l1, &w1) != 3) {
        printf("invalid input\n");
        return 1;
    }
    printf("STUDENT INFORMATION:\n");
    printf("\n%-10s\t %-4.3f\t %-4.3f\n", id1, l1, w1);
    return 0;
}
0 голосов
/ 25 ноября 2018

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

...