プロが教える店舗&オフィスのセキュリティ対策術

TCHAR文字列?の特定部分の数字文字をint型の数値に変える方法ですが
どうすればよいでしょうか?


int test(LPCTSTR s)
{
int a, b, c, d;

/*
TCHAR?型文字列を数値のintに変える方法???
 a = 12の前2桁
b = 34の2桁
c = 5の最後の1桁
*/

d = a + b - c;
return d;

}

ret = test(_T("12345"));
の場合、retに41が返ってきてほしい。

A 回答 (3件)

数字に変換するための文字列を格納できるバッファを準備して


そこに元文字列の指定位置から切り出して数値に変換します

今回の場合なら 受け取る文字列のバッファは2文字とC/C++の文字列の終端をあらわすNULL文字との3文字分が最低でも入ります

int test( LPCTSTR s )
{
  TCHAR buf[3];
  TCHAR *p = s;
  int a,b,c,d;
  // 受け取り側を初期化
  buf[0] = buf[1] = buf[2] = _T('\0');
  // 12 をコピー
  _tcsncpy( buf, p, 2 );
  a = atoi( buf );

  // 受け取り側を初期化
  buf[0] = buf[1] = buf[2] = _T('\0');
  // 34 をコピー
  p += 2;
  _tcsncpy( buf, p, 2 );
  b = atoi( buf );

  // 受け取り側を初期化
  buf[0] = buf[1] = buf[2] = _T('\0');
  // 5 をコピー
  p += 2;
  _tcsncpy( buf, p, 1 );
  c = atoi( buf );

  d = a + b - c;

  return d;
}
といった具合です

または sscanfを使ってもいいのであれば

int test(LPCTSTR s )
{
  int a, b, c, d;
  // 文字列が不正だった場合の特殊な値
  d = -9999;
  if ( 3 == _stscanf( s, _T("%2d%2d%d"), &a, &b, &c ) ) {
    d = a + b - c;
  }
  return d;
}
といった具合です
    • good
    • 0

横から失礼


> a = atoi( buf );
a = _ttoi( buf );

TCHAR型なので、atoi()ではなく、_ttoi()だと思う。

この回答への補足

ご指摘、ありがとうございます。

補足日時:2009/05/01 21:18
    • good
    • 0

10進数5桁であるなら……。


int test (LPCTSTR s)
{
int val, a, b, c, d;
val = (int)_tcstol(s, 0, 10); /* 数字を数値に変換 */
a = (val / 1000) % 100;
b = (val / 10) % 100;
c = val % 10;
d = a + b - c;
return d;
}
というのもありですね。
# エラー処理は端折っています。

参考URL:http://msdn.microsoft.com/ja-jp/library/w4z2wdyc …
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A