0

gccでコンパイルしている次のコードがあります。

int parseMsg(const char *msg_to_parse, unsigned long *exp_input, unsigned long *sysTicks )
{
   int l_msg_size = strlen(msg_to_parse);
   if(l_msg_size <10)
          return -1;
    char l_exp_input_arr[10];
    char l_sys_ticks_arr[10];
    memcpy(l_sys_ticks_arr,msg_to_parse+12,10);

    memcpy(l_exp_input_arr,msg_to_parse,10);
   //l_msg_size = strlen(msg_to_parse);
    *sysTicks = strtoul(l_sys_ticks_arr,NULL,10);

   *exp_input = strtoul(l_exp_input_arr,NULL,10);



   return 0;
}

そして、私はそれを次の方法でテストしようとしています:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int parseMsg(const char *msg_to_parse, unsigned long *exp_input, unsigned long *sysTicks );

int main(void) {
char msg[] = "1234567890  59876543213";
unsigned long along1, along2;
along1 =0;
along2=0;
parseMsg(msg,&along1, &along2 );
printf("result of parsing: \n \t Along 1 is %lu \n \t Along 2 is %lu \n",along1, along2);
return 0;
}

しかし、私は次の結果を得ています:

構文解析の結果:1に沿って12345678902に沿って4294967295

なぜ2番目のunsignedlongが間違っているのですか?

ありがとう

4

2 に答える 2

7

指定した 2 番目の整数は大きすぎて、アーキテクチャのメモリで表現できません。したがって、その API によると、strtoulは ULONG_MAX (アーキテクチャでは =4294967295) を返し、 errnoERANGEに設定します。

strtoul API はこちら: http://www.cplusplus.com/reference/clibrary/cstdlib/strtoul/

ただし、strtoul数値以外の文字に遭遇したときにのみ解析を停止するため、より小さい整数を指定した場合にも失敗する可能性があります。それを保証しなかったので、strtoulが文字列の直後にメモリ内にあるものを解析しようとしないとは確信できません。(したがって、ランダムであると仮定すると、256 のうち 10 の確率で変換エラーが発生します)

文字列を \0 で終了します。それで問題ありません:

char l_exp_input_arr[11]; // +1 for \0
char l_sys_ticks_arr[11];

memcpy(l_sys_ticks_arr, msg_to_parse+12, 10);
l_sys_ticks_arr[10] = '\0';

memcpy(l_exp_input_arr, msg_to_parse, 10);
l_exp_input_arr[10] = '\0';
于 2012-06-25T13:12:54.113 に答える
0

2 つの一時的な char[] 変数を 1 文字長くしてから、最後の文字を NULL にする必要があります。

于 2012-06-25T13:08:28.060 に答える