我正在尝试将此字符串"09195462965"
转换为int,但我遇到了问题。
我的代码片段:
int n, p, pnum=0;
char buffer[256];
char *endptr;
long pnumber;
bzero(buffer,256);
p = read(sock,buffer,255);
pnumber = strtol(buffer, &endptr, pnum);
printf("n: %ld",pnumber);
p = write(sock,buffer,sizeof(buffer));
客户端发送一个"09195462965"
的字符串,然后服务器就会收到它。
现在在服务器上,该字符串必须变为int
,即09195462965
。
注意:服务器将数字作为字符串发送。
答案 0 :(得分:3)
您错误地使用strtol()
,最后一个参数应该是您想要的基础。例如,如果要将该数字存储在基数10(十进制)中:
long pnumber;
pnumber = strtol("09195462965", NULL, 10); //nst char *nptr is "09195462965"
//char **endptr is null
//int base is 10 for decimal
printf("n: %ld",pnumber);
>> 9195462965
请务必阅读man page以了解您正在使用的功能。
传递pnum
(设置为0
)作为对最后一个参数的操作会导致它回吐“0”,因为你传入的数字。
09195462965有0-9的数字(所以我假设你想要dec)如果你将“0”传递给strtol()
那么它会看到第一个0
并且会将数字视为八进制,问题在于八进制数从0到7,因此对于八进制数,9是“超出界限”,因此strtol()
向后吐出0。
使用类似:07175462765
的数字,当它为0时,您可以传入pnum
。
答案 1 :(得分:1)
这太大了,不适合int
。试试strtoumax
并将其存储在uintmax_t
。
uintmax_t pnumber = strtoumax(buffer, &endptr, 10);
if (pnumber == UINTMAX_MAX && errno == ERANGE)
/* Too big. */
或者,如果您没有strtoumax
,可以尝试strtoull
等。