如何将输入从 read() 转换为 int

How to convert input from read() to int

我有以下 C 代码:

#include<stdio.h>
#include<unistd.h>
#include <arpa/inet.h>

int main()
{
        uint32_t input;
        read(0, &input, 4);
        printf("%d",input);
        return 0;

}

当我输入 1234 时,我希望它在 return 中打印 1234,但我得到的却是 875770417

另外,如果我有一个不可更改的程序:

#include<stdio.h>
#include<unistd.h>
#include <arpa/inet.h>
int main()
{
        uint32_t a=123;
        uint32_t b=123;
        uint32_t sum=a+b;
        uint32_t input;
        read(0, &input, 4);
        if(sum == input)
                printf("Done\n");
        return 0;

}

如何才能到达打印语句?因为输入246不行

8757704171234 完全相同,如果您将此数字解释为小端字节数的话。这里有一些快速 Python 代码可以说明这一点:

>>> (875770417).to_bytes(4, 'little')
b'1234'

The read syscall 将读取您输入的原始字节:

ssize_t read(int fd, void *buf, size_t count);

read() attempts to read up to count bytes from file descriptor fd into the buffer starting at buf.

您输入了以下字节:

49, 50, 51, 52

...这是 string 1234.

的 ASCII 码

您需要将此字符串转换为整数,但首先将此字符串读入某个缓冲区:

char buffer[64] = {0};
read(0, buffer, 4);

然后用atoi解析buffer中的字符串并转换为整数:

$ cat test.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    char buffer[64] = {0};
    uint32_t input;

    read(0, buffer, 4);
    input = atoi(buffer);

    printf("You entered: '%d'\n", input);
}
$ clang test.c && ./a.out
1234
You entered: '1234'
$ 

当您键入“1 2 3 4 [Enter]”时,read() 会将其解释为字符“1”、“2”、“3”和“4”后跟一个换行符。也就是说,将每个字节打印为整数可能会产生 49、50、51、52、10:每个字符的 ASCII 值。更正确的方法是制作一个字符数组,读入它,然后使用字符串到整数的转换函数,如 atoi() 或(更好)strtol()。示例:

int main(void)
{
    char arr[6];
    read(0, arr, 6);
    long res = strtol(arr, NULL, 10);
    printf("%d", res);
}
#include <stdio.h>
#include <stdlib.h>

int main(void){
    char b[5];
    scanf("%s", b);
    int c=0;
    char *pb=&b[0];
    c=atoi(pb);
    printf("%d\n", c);
    system("pause");
}