電子書籍の厳選無料作品が豊富!

こんにちは。
C++をVS2005でやっています。
atoi関数を使っているんですが、10個の配列strにstrncpyをやると値がおかしくなります。
10個目に'\0'を代入させてやってみても駄目でした。 以下にソースを載せます。


#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int main( void )
{
char string[256];
char str[10];
char *moji = "12345464";
int l;

// using template versions of strcpy_s and strcat_s:
strcpy(string, "6877897898");
strcat(string, "strcpy_s");
strcat(string, "and");
// of course we can supply the size explicitly if we want to:
strcat(string, "strcat_s!");
strncpy(str, string, 10);
l = strtol(str,NULL,10);// 値が違う 6877897898にならない
printf("str = %d\n", l);
l = atoi(moji);
printf("moji = %d\n", l);
l = atoi(string);// 値が違う
printf("string = %d\n", l);
printf("String = %s\n", string);

getchar();
return 0;
}

表示結果
str = 2147483647
moji = 12345464
string = 2147483647
String = 6877897898

mojiは正常に動作しますから、ナル文字が原因なのかと思ってしまいますが。原因がいまいち分かりません。 よろしくお願いします。

A 回答 (2件)

> strncpy(str, string, 10);


> l = strtol(str,NULL,10);// 値が違う 6877897898にならない

ここで'\0'の問題があるのはおわかりでしょう。

あとは、intの範囲です。
VS2005であれば、intは32bitのはずなので、表現できる範囲は-2147483648~2147483647となります。10桁の整数すべてを表現するには十分ではありません。
    • good
    • 0
この回答へのお礼

確かにそうです。
問題が解決しました。
atoi関数の返値がint型なので32bit 2147483648~2147483647は無理ですね。
指摘したとおりにしましたら動作しました。

お礼日時:2011/07/27 14:01

6877897898はint型に格納できる範囲の数字を超えています。


int型は-2147483648~2147483647の範囲までしか格納できません。
その範囲であれば正しく動作すると思います。
    • good
    • 0
この回答へのお礼

 6877897898は十桁なんだから億単位で、すでに32bitの範囲外だったことに気づきました。 修正しましたら正常に動作しました。
ありがとうございます。

お礼日時:2011/07/27 14:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!