How can I substring a TCHAR
Asked Answered
D

4

5

I have a TCHAR and value as below:

TCHAR          szDestPathRoot[MAX_PATH]="String This";

Now I want the 1st three character from TCHAR , like below:

szDestPathRoot.substring(0,2);

How can I do this.

Dross answered 28/10, 2010 at 4:47 Comment(4)
Hello, you should use MAX_PATH + 1 to prevent overflows.Hydrogenolysis
@Benoit: MAX_PATH is 260, which includes the null termination length. (The maximum supported path length is 255 characters) See msdn.microsoft.com/en-us/library/aa365247.aspxThayne
Your string literal should be enclosed in the _T() macro. That will make it a wide string literal in unicode builds.Gama
I did not downvote, but I would guess the downvote would be because the question reflects a non understanding of the C language itself. You should probably get your hands on a C book and learn C before attempting Win32 stuff.Thayne
N
13

TCHAR[] is a simple null-terminated array (rather than a C++ class). As a result, there's no ".substring()" method.

TCHAR[] (by definition) can either be a wide character string (Unicode) or a simple char string (ASCII). This means there are wcs and str equivalents for each string function (wcslen() vs strlen(), etc etc). And an agnostic, compile-time TCHAR equivalent that can be either/or.

The TCHAR equivalent of strncpy() is tcsncpy().

Final caveat: to declare a TCHARliteral, it's best to use the _T() macro, as shown in the following snippet:

TCHAR szDestPathRoot[MAX_PATH] = _T("String This");
TCHAR szStrNew[4];
_tcsncpy (str_new, szTestPathRoot, 3);

You may find these links to be of interest:

Nisi answered 28/10, 2010 at 5:40 Comment(1)
TCHAR is not an array type.Southeasterly
E
4
TCHAR szDestPathRoot[MAX_PATH]="String This";
TCHAR substringValue[4] = {0};
memcpy(substringValue, szDestPathRoot, sizeof(TCHAR) * 3);
Elspeth answered 28/10, 2010 at 4:52 Comment(1)
@Blindy: memcpy is an ansi c method that takes a const as the second param. How does this destroy the original string?Elspeth
T
1

This is somewhat ugly but if you know for sure that:

  1. The string holds at least 4 TCHAR (3 chars plus the terminating NUL)
  2. The content of the string can be modified (which is the case in your example).
  3. You don't have to keep the original string intact

You could just put a terminating NUL at the 4th position to make the string 3 char long.

szDestPathRoot[3] = _T('\0');

Note that this operation is destructive to the original string

You should really be using a string class in C++ code though.

Taut answered 28/10, 2010 at 4:48 Comment(7)
@Alexandre Jasmin , I don't understand how does this substring the szDestPathRoot . I need Str from the above assignmentDross
@Subhen: It has a bug (it should be placing the NULL at position 4), but what it does is limit the length of the string to x-1 number of characters. The code places the string ending character (NULL) at position three, and therefore the length of the string in question becomes two.Thayne
@Billy ONeal s[0]='S'; s[1]='T'; s[2]='R'; s[3]='\0'. I count three chars.Gama
@Alexandre: No, the length of the string is 2. It occupies 3 bytes of memory, but the null is not part of the string.Thayne
@Billy, I think I see why you're confused. That's an assignment statement, not an array declaration.Pl
You should note that this is destructive to the original string.Pl
@Mark: Oops. I'll get surgury to remove the foot next week :)Thayne
V
1

As you have tagged your question with "C++" you can use the string classes of the std library:

std::wstring strDestPathRoot( _T("String This") );
strDestPathRoot.substr( 0, 2 );
Venenose answered 28/10, 2010 at 7:14 Comment(4)
I do not want to convert to stringDross
Then just use strncpy or strncpy_s. But, however, why not using std's string classes?Venenose
Two nitpicks. 1. std::wstring is a string of wchar_t not TCHAR. With std::wstring don't use the _T() macro just prefix the literal with an L. 2. As @user421195 mentioned the TCHAR version of strncpy() is tcsncpy()Gama
If you're using TCHAR, it should be std::basic_string<TCHAR>, not std::wstring.Shatzer

© 2022 - 2024 — McMap. All rights reserved.