-1

"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サーバー上で、その文字列をieに変換する必要があります09195462965

注: サーバーは数値を文字列として送信します。

4

2 に答える 2

3

strtol()間違って使用しているので、最後のパラメータは必要なベースにする必要があります。たとえば、その数値を基数10(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

使用している関数のマニュアルページを必ずお読みください。

pnum最後のパラメーターに対して行うように(に設定されている)を渡す0と、渡す番号が原因で「0」が返されます。

09195462965には0から9までの数字があります(したがって、decが必要だったと思います)。「0」を渡すとstrtol()、最初に0それが表示され、数値が8進数として扱われます。問題は、8進数が0から始まることです。したがって、9は、8進数の「範囲外」であり、strtol()0を返します。

次のような数字を使用すると、0のとき07175462765に渡しても問題ありません。pnum

于 2012-11-25T15:50:40.690 に答える
1

大きすぎて に収まりませんintstrtoumaxに保存してみてくださいuintmax_t

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

あるいは、お持ちでない場合は、et al.strtoumaxを試すことができます。strtoull

于 2012-11-25T15:30:46.537 に答える