如何将输入从 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不行
875770417
与 1234
完全相同,如果您将此数字解释为小端字节数的话。这里有一些快速 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");
}
我有以下 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不行
875770417
与 1234
完全相同,如果您将此数字解释为小端字节数的话。这里有一些快速 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 tocount
bytes from file descriptorfd
into the buffer starting atbuf
.
您输入了以下字节:
49, 50, 51, 52
...这是 string 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 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");
}