Re: Convert CString to LONG.
"Control Freq" <nick@nhthomas.freeserve.co.uk> ha scritto nel messaggio
news:347dfda4-8d31-46c7-b3b6-37abf7e8d432@y38g2000hsy.googlegroups.com...
// Get user input.
TCHAR Command[100];
cin.getline(Command, sizeof(Command), '\n');
I think that istream::getline has char* as input parameter.
So, the correct and coherent way should be:
char Command[ 100 ];
cin.getline( Command, sizeof( Command ) );
// ... or you may want to use
// _countof( Command ) which is == sizeof( Command )
// in this case of char-based string
There is also a Unicode wide-version of istream: wistream.
....Actually, both istream and wistream are a template specialization of
basic_istream template:
typedef basic_istream<wchar_t, char_traits<wchar_t> > wistream;
The Unicode version of cin is wcin.
There is also a std::getline function, to be used something like this:
string command;
getline( cin, command, '\n' );
The Unicode version should be:
wstring command;
getline( wcin, command, L'\n' );
// Convert to a CString.
CString Item(Command);
I think that CString has a conversion constructor, which takes a char string
and convert to TCHAR string (i.e. in Unicode builds, when TCHAR expands to
wchar_t, this constructor converts from const char * ANSI string to wchar_t
Unicode string).
So, the above code should be fine.
TCHAR *StopString;
// Try to convert to an integer.
errno = 0;
LONG Value = strtol(Item, &StopString, 10);
No, the above code is not Unicode-aware. If you use TCHAR, you should use
_tcstol instead of strtol (strtol is fine if you use char, not TCHAR).
So, you should have:
long value = _tcstol( Item, &StopString, 10 );
// Invalid argument, or out of range.
cerr << endl << _T("Invalid. The number is out of range.") <<
If you use cerr, you should use ANSI strings, e.g.
cerr << endl << "Invalid. The number is out of range."
<< endl << endl;
If you use wcerr, you can use Unicode strings (with L prefix).
The point is that the _T() decorator does not play well with C++ standard
library... it's more a Windows-specific stuff.
Another option would be to use sscanf (or Unicode-aware _stscanf):
<code>
int ParseInt( LPCTSTR s )
{
ASSERT( s != NULL );
int n;
_stscanf( s, "%d", &n );
... check parsing error
return n;
}
CString item;
int n = ParseInt( item );
</code>
HTH,
Giovanni