3

我正在学习 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吗?

4

4 回答 4

6

1将十进制数字与数字一混淆。您还将第一名与第一名的计算机内部表示混淆了。

敲击1键盘上的键的人不是在输入计算机内部表示的数字。因此,将该键直接读入整数变量会产生垃圾。

计算机内部将 2609 存储为 0x31、0x0A(假设为 little-endian)。当这个人点击1然后输入时,键盘会发送一个 0x31(的 ASCII 代码1),然后是一个输入 (0x0A)。

但这是一个垃圾进,垃圾出的例子。您不应该将整数的地址传递给不需要指向整数的指针的函数。

于 2012-05-31T18:31:14.537 回答
2

我假设您正在阅读标准输入...

使用 scanf 函数

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

在您的代码中:

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

见网址: http ://en.wikipedia.org/wiki/Scanf_format_string

于 2012-05-31T19:29:23.783 回答
1

你需要阅读二进制和ASCII。您将 ASCII 输入控制台,然后将其再次转换为 ascii。

此外,一个字符(通常)只有 1 个字节。您正在阅读 4(假设这是 int 的大小)。你有很多研究和阅读在你面前。

于 2012-05-31T18:31:23.543 回答
1

您正在character从流中读取 a 并尝试将其打印为integer.

采用:

printf("%c", buffer);
于 2012-05-31T18:34:40.620 回答