Как преобразовать ввод из read () в int - PullRequest
2 голосов
/ 07 апреля 2020

У меня следующий 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, я ожидаю, что он напечатает 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 не работает.

Ответы [ 3 ]

6 голосов
/ 07 апреля 2020

875770417 буквально совпадает с 1234, если вы интерпретируете это число как байты с прямым порядком байтов. Вот небольшой быстрый код Python, который показывает это:

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

read системный вызов будет читать необработанные введенные вами байты:

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

read() пытается прочитать до count байтов из файлового дескриптора fd в буфер, начиная с buf.

Вы ввели следующие байты:

49, 50, 51, 52

... которые являются ASCII-кодами строки 1234.

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

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 голос
/ 07 апреля 2020
#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");
}
1 голос
/ 07 апреля 2020

Когда вы набираете «1 2 3 4 [Enter]», read() интерпретирует его как символы «1», «2», «3» и «4», за которыми следует новая строка. То есть печать каждого байта в виде целого числа, вероятно, даст 49, 50, 51, 52, 10: значение ASCII каждого символа. Более правильным способом было бы создать массив символов, прочитать его, а затем использовать функцию преобразования строки в int, например atoi() или (лучше) strtol(). Пример:

int main(void)
{
    char arr[6];
    read(0, arr, 6);
    long res = strtol(arr, NULL, 10);
    printf("%d", res);
}
...