Re: How to revise a charactor in string?
"Lorry Astra" <LorryAstra@discussions.microsoft.com> ha scritto nel
messaggio news:E7BF9B64-C777-4A20-AC50-74F36F36C2DC@microsoft.com...
Hi,please help me to resolve these questions. thanks.
#include<iostream>
#include<string>
using namespace std;
int main()
{
char* c="abcd";
int count=(int)strlen(c);
\\ *(c+count-1)='e'; !! This line is wrong
The problem is that the "abcd" string built as you did is a "read-only"
string.
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):
<code>
#include <iostream>
#include <cstring>
using std::cout;
using std::endl;
int main()
{
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;
system("PAUSE");
return 0;
}
</code>
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.
For example:
char* c="abcde";
char z[]="abcde";
(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
get
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
convert
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:
<code>
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
</code>
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.
HTH,
Giovanni