2012-05-31 4 views
1

Я учусь C, и я не понимаю поведение кода ниже:C - чтение целых чисел из стандартного ввода с использованием чтения()

#include <sys/types.h> 
#include <sys/uio.h> 
#include <unistd.h> 
#include <stdio.h> 

int main() {  
    int buffer; 
    read(0, &buffer, sizeof(int)); 
    printf("%d", buffer); 
    return 0; 
} 

Вход:

1 

Выход:

2609 

Что здесь происходит? Разве выход не должен быть 1?

ответ

6

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

Лицо, нажатие клавиши 1 на клавиатуре, не вводит внутреннее представление компьютера для номера один. Поэтому чтение этого ключа непосредственно в целочисленную переменную даст мусор.

Компьютер внутренне хранит 2609 как 0x31, 0x0A (предположительно мало-endian). Когда человек нажимает 1, а затем вводит, клавиатура отправляет 0x31 (код ASCII для 1), а затем вводит (0x0A).

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

1

Вам необходимо прочитать бинарные и ascii. Вы вводите ASCII в консоль, а затем конвертируете его в ascii.

Кроме того, символ только (обычно) 1 байт. Вы читаете в 4 (предполагая, что это размер int). У вас много исследований и чтения перед вами.

1

Вы читаете character из потока и пытаетесь распечатать его как integer.

Использование:

printf("%c", buffer); 
1

Я предполагаю, что ваш читают со стандартного ввода ...

Используйте функцию зсапЕ

int scanf(const char *format, ...); 

В коде:

int main() {  
    int buffer; 
    scanf("%d", &buffer); 
    printf("%d", buffer); 
    return 0; 
} 

See URL : http://en.wikipedia.org/wiki/Scanf_format_string

Смежные вопросы