こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

strncpy後のatoiがおかしい

こんにちは。
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は正常に動作しますから、ナル文字が原因なのかと思ってしまいますが。原因がいまいち分かりません。 よろしくお願いします。

投稿日時 - 2011-07-27 12:46:57

QNo.6902729

すぐに回答ほしいです

質問者が選んだベストアンサー

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

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

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

投稿日時 - 2011-07-27 13:12:13

お礼

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

投稿日時 - 2011-07-27 14:01:05

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

6877897898はint型に格納できる範囲の数字を超えています。
int型は-2147483648~2147483647の範囲までしか格納できません。
その範囲であれば正しく動作すると思います。

投稿日時 - 2011-07-27 13:12:15

お礼

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

投稿日時 - 2011-07-27 14:03:37

あなたにオススメの質問