Re: How to revise a charactor in string?
"Lorry Astra" <LorryAstra@discussions.microsoft.com> ha scritto nel
Hi,please help me to resolve these questions. thanks.
using namespace std;
\\ *(c+count-1)='e'; !! This line is wrong
The problem is that the "abcd" string built as you did is a "read-only"
You can modify 'c' pointer address, to e.g. point to a different string.
But you can't modify the data (characters) of the read-only string that you
used to initialize the 'c' pointer.
1. The comment line is what I want to do, I want to revise the last
charactor in this string,please tell me what I should do.
The "algorithm" is good, the problem is the implementation, i.e. you need a
readable and *writable* character buffer to modify the string.
You may consider the following working code (compiled with VS2008):
char * c = "abcd";
int count = (int)strlen(c);
// Alloc buffer on the stack for "mutable" string
char s[ 100 ];
// Copy source (read-only) string to buffer
strcpy( s, c );
// better using a safe string function, like StringCbCopy here...
// this is just a quick "demo"
// Modify the last character in auxiliary buffer (s)
s[count-1] = 'e';
cout << "Original string: " << c << endl;
cout << "Modified string: " << s << endl;
2.If a char* point to a string (just like char* c="abcd"), I think the
"abcd" is a const value for the char*, is that right?
Yes, see previous point.
(I think that in VC6 it was possible to modify also that kind of strings...
but I'm not sure; however, with more modern VS2008 you can't anymore.)
3.I always wonder about char* and char array.
(a) if I want to get length of these two string, I type sizeof(c) and
sizeof(z), but these two values is totally different. why? and how can I
a the length of string which is pointed by char*?
'c' is a *pointer*, so its size in bytes (the value returned by 'sizeof') is
the size of a pointer, and it is 4 bytes (4 bytes * 8 bits/byte = 32 bits on
32 bits platforms).
'z' is an array, so its size is <number of element in z> * sizeof< an
element of z > = 6 [=strlen(z)+1] * sizeof(char) = 6 * 1 = 6 bytes.
(b) If I can only get a char* which points to a string, how can I
char* to char array. I mean:
void chartrim(char* c)
\\ here,I want to define a char array whose content
is same with char* c. please tell me how to do?
You have several options.
For example, you can get the number of characters pointed by 'c', and
allocate memory on the heap using 'new ', something like this:
ASSERT( c != NULL ); // check pointer
// Alloc memory on the heap
char * copy = new char[ strlen(c) + 1 ];
// Copy to destination buffer
strcpy( copy, c );
// copy is a modifiable char array...
// Release the buffer
delete  copy;
copy = NULL; // avoid dangling references
However, I would use a robust C++ string class to manage strings, like
CString (from ATL), or std::string or std::wstring from standard C++ library
(but, IMHO, for Windows C++ programming, CString/A/W are better designed
than std:: string classes).
Moreover, if you need to manage dynamic array, using std::vector is better
than raw new calls (for several reasons, for example: std::vector does
bounds-checking on vector index, it releases its own memory when variable
goes out of scope, etc.).
And if you really need to access low-level C string functions, I think you
may consider safe string functions like StringCbCopy, etc.