高分问关于char*的问题,大侠请进

IonEdge 2006-01-03 09:54:31
char *a = "bcd";
char *b = "faf";
a = b;
或者
memset(a,0,strlen(a)+1);
memcpy(a,b,strlen(a)+1);

是不是不管哪种方法,此时a的值还是"bcd";还是未定义的值?
如果改不了,那么是不是意味着char *a 只能在初始化的时候给他赋值一次

如果是这种情况呢:
char *a = new char[100];
char *b = "faf";
能不能给a多次赋值,还是只能赋初值,多谢了
解释下原因
...全文
169 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel_rabbit 2006-01-04
  • 打赏
  • 举报
回复
studying
iicpp 2006-01-04
  • 打赏
  • 举报
回复
函数写得有问题。
void CWord :: operator = (char *ch){
delete [] _word;
_size = strlen(ch)+1;
_word = new char[_size];
memset(_word,0,_size);
memcpy(_word,ch,_size);
}

此外,要写得完整,还需要考虑写拷贝构造函数,运算符重载operate = (const CWord &)
zephyr007 2006-01-03
  • 打赏
  • 举报
回复
operator = 重载有问题,_word缓冲区大小可能不足以容下ch的长度,应先判断ch的长度,必要情况向重新分配_word,然后再memcpy
guyanhun 2006-01-03
  • 打赏
  • 举报
回复
浅拷贝的问题
IonEdge 2006-01-03
  • 打赏
  • 举报
回复
以上问题找到了,新问题:
#include <iostream>
#include <string>
using namespace std;

class CWord{
public:
CWord(char* s){
_word = new char[strlen(s)+1];
memset(_word,0,strlen(s)+1);
memcpy(_word,s,strlen(s)+1);
_size = strlen(s) + 1;
}
~CWord(){
delete[]_word;
}

void operator = (char *ch);
void inverse();
char* GetWord()const;
int GetSize()const;
private:
char* _word;
int _size;
};

ostream& operator << (ostream& os,CWord& word){
os << word.GetWord();
return os;
}

void CWord :: operator = (char *ch){
memset(_word,0,strlen(_word)+1);
memcpy(_word,ch,strlen(ch)+1);
_size = strlen(ch)+1;
}
void CWord::inverse(){
for(int i = 0;i <= (_size-1)/2-1; i++){
char temp = _word[i];
_word[i] = _word[_size - 2 - i];
_word[_size - 2 - i] = temp;
}
}

char* CWord :: GetWord()const{
return _word;
}

int CWord :: GetSize()const{
return _size;
}
void main()
{
CWord myword("i love you");
myword.inverse();
char seps[] = "' '";;
char s[100];
memset(s,0,100);
memcpy(s,myword.GetWord(),myword.GetSize());
char* token = strtok(s,seps);
CWord word(token);
while(token != NULL){
// CWord word(token);
word = token;
word.inverse();
cout << word;
token = strtok(NULL,seps);
}
}
//结果正确,运行期有错误
IonEdge 2006-01-03
  • 打赏
  • 举报
回复
那请问这段代码为什么会有问题:

#include <iostream>
#include <string>
using namespace std;

class CWord{
public:
CWord(char* s){
_word = new char[strlen(s)+1];
memset(_word,0,strlen(s)+1);
memcpy(_word,s,strlen(s)+1);
_size = strlen(s) + 1;
}
~CWord(){
delete[]_word;
}

void operator = (char *ch);
void inverse();
char* GetWord()const;
int GetSize()const;
private:
char* _word;
int _size;
};

ostream& operator << (ostream& os,CWord& word){
os << word.GetWord();
return os;
}

void CWord :: operator = (char *ch){
memset(_word,0,strlen(_word)+1);
memcpy(_word,ch,strlen(ch)+1);
}
void CWord::inverse(){
for(int i = 0;i <= (_size-1)/2-1; i++){
char temp = _word[i];
_word[i] = _word[_size - 2 - i];
_word[_size - 2 - i] = temp;
}
}

char* CWord :: GetWord()const{
return _word;
}

int CWord :: GetSize()const{
return _size;
}
void main()
{
CWord myword("i love you");
myword.inverse();
char seps[] = "' '";;
char s[100];
memset(s,0,100);
memcpy(s,myword.GetWord(),myword.GetSize());
char* token = strtok(s,seps);
CWord word(token);
while(token != NULL){
// CWord word(token);
word = token;
word.inverse();
cout << word;
token = strtok(NULL,seps);
}
}//本应该输出you love i的
sankt 2006-01-03
  • 打赏
  • 举报
回复
char *a = "bcd"; //这样实质上是const char *a="bcd"; a指向的内存是只读的.

char *a = new char[100];
char *b = "faf";
这样可以给a多次赋值

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧