linux C字符串为int

时间:2012-11-25 15:28:19

标签: c linux strtol

我正在尝试将此字符串"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

注意:服务器将数字作为字符串发送。

2 个答案:

答案 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等。