Считывать число из стандартного набора и сохранять как целое напрямую, используя функцию read()

#c #linux #pointers #stdin

#c #linux #указатели #стандартный набор

Вопрос:

 #include <stdio.h>
#include <unistd.h>

int main(){
    int num;
    int read_bytes = read(0,amp;num,sizeof(int));

    printf("read %d bytes :[%d]n",read_bytes,num);
}
 

когда я выполняю этот код, он возвращает просто случайное целое число, например 724109877

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

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

1. Вероятно, вы будете получать текстовый ввод от stdin but read , который обычно используется для двоичного ввода. Попробуйте использовать int items = scanf("%d", amp;num); , когда вы написали «случайное целое число, например 724109877», это было фактическое значение, которое вы прочитали, или какое-то случайное значение у вас под рукой?

2. Что вы предоставляете своей программе для ввода?

3. некоторое случайное значение, но, похоже, имеет некоторое отношение, например, вход 1 для 7329123 и вход 2 для 7329124

4. Это «случайное» значение представляет собой коды символов ASCII (или совместимые) для 5 NL ) в системе с малым порядковым номером или ) NL 5 в системе с большим порядковым номером. Я бы добавил, что для большинства реализаций C по умолчанию stdin считывает текстовые данные от пользователя -пользователя, но обычно вы можете перенаправить stdin для чтения из файла или программы, которые обычно могут быть либо текстовыми, либо «двоичными» (raw) в зависимости от большого количества факторов, которые вы полностью проигнорировали.

5. Пожалуйста, укажите фактические входные и выходные данные, а не «какое-то случайное число». Вы указываете read ввести 4 байта: вы вводите 4 байта? Вы получите больше информации, если вы инициализируете int num = 0xAAAAAAAA; и выводите значение в шестнадцатеричном формате.

Ответ №1:

Вы можете сделать это, прочитав строку и позже преобразовав ее в число:

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

int main()
{
    size_t  nb_bytes, buffer_size = 32;
    char    *buffer = malloc(sizeof(char) * (buffer_size   1));
    int     number;

    buffer[buffer_size] = '';
    nb_bytes = getline(amp;buffer, amp;buffer_size, stdin);
    number = atoi(buffer);

    printf("read %zu bytes :[%d]n", nb_bytes, number);

    free(buffer);
    return (0);
}
 

Обратите внимание, что это nb_bytes будет включать символ новой строки, вы можете вычесть 1, чтобы получить длину вашего числа.

2-е решение

Вы также можете просто использовать scanf, а затем, если вам нужно получить длину числа, вы можете легко ее вычислить. Вот пример:

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

size_t get_number_length(int n)
{
    size_t length = n < 0 ? 1 : 0;

    if (n == 0)
        return (1);
    while (n != 0)
    {
        n /= 10;
        length  ;
    }
    return (length);
}

int main()
{
    int number;

    scanf("%d", amp;number);
    size_t number_length = get_number_length(number);

    printf("read %zu bytes :[%d]n", number_length, number);

    return (0);
}
 

Ответ №2:

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

int main(){
    char num[100];
    char *p;
    int read_bytes = read(0,num, 5*sizeof(long)); // increase size according to your input
    long n = strtol(num,amp;p,10);

    printf("read %d bytes :[%ld]n",read_bytes,n);
}
 

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

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

1. Этот код не работает, если вы указываете число> 9999. Количество байтов, которое read на самом деле занимает, — это количество символов, которые будут считаны из stdin, поэтому, если вы укажете число, содержащее больше символов, чем sizeof(int) (часто 4), оно преобразует это число

2. То же самое с sizeof(long) , это не имеет значения, так как sizeof(long) часто равен 8, а int может иметь длину 11 символов (INT_MIN).

3. Согласен. Мы должны увеличить его размер, исходя из наших требований. Если вы считаете, что вам нужно более высокое значение, увеличьте размер. Умножить на некоторый коэффициент.