【问题标题】:linux C string to int [closed]linux C字符串到int [关闭]
【发布时间】:2012-11-25 15:28:18
【问题描述】:

我正在尝试将此字符串 "09195462965" 转换为 int 但我遇到了问题。

我的代码的sn-p:

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

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

【问题讨论】:

  • 我认为 int 的最大尺寸不会大于 09195462965。

标签: c linux strtol


【解决方案1】:

您错误地使用了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

【讨论】:

  • 如果 base 的值为零,则主题序列的预期形式是 [...] 中描述的整数常量,因此 base = 0 可能是如果将数字解释为八进制,则 op 是什么。我只添加了引用,因为您在答案中发布了 确保您阅读了手册页... ;)
  • @cnicutar - 哦不用担心,我只是没有解释为什么该字符串对pnum=0无效,因为我认为OP会阅读手册页并弄清楚。 ;) 但我现在更新了。
【解决方案2】:

这太大了,无法放入 int。尝试strtoumax 并将其存储在uintmax_t 中。

uintmax_t pnumber = strtoumax(buffer, &endptr, 10);
if (pnumber == UINTMAX_MAX && errno == ERANGE)
    /* Too big. */

或者,如果您没有strtoumax,您可以尝试strtoull 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    相关资源
    最近更新 更多