#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
butread
, который обычно используется для двоичного ввода. Попробуйте использовать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. Согласен. Мы должны увеличить его размер, исходя из наших требований. Если вы считаете, что вам нужно более высокое значение, увеличьте размер. Умножить на некоторый коэффициент.