我的代码是这样的。你能告诉我为什么它的表现不像我期望的那样吗?
/*
* test.cpp
*
* Created on: Dec 6, 2012
* Author: sandeep
*/
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int i=0;
string s="hello A B:bye A B";
char *input;
input=new char(s.size());
for(i=0;i<=s.size();i++)
input[i]=s[i];
char *tokenized1[2],*tokenized2[3];
tokenized1[0]=strtok(input,":");
tokenized1[1]=strtok(NULL,":");
i=0;
char *lstring;
while(i<2)
{
lstring=new char(strlen(tokenized1[i]));
memcpy(lstring,tokenized1[i],strlen(tokenized1[i])+1);
cout<<tokenized1[0]<<" "<<tokenized1[1]<<endl;
tokenized2[0]=strtok(lstring," ");
tokenized2[1]=strtok(NULL," ");
tokenized2[2]=strtok(NULL," ");
char c=tokenized2[0][0];
cout<<c<<endl;
cout<<tokenized2[0]<<" "<<tokenized2[1]<<" "<<tokenized2[2]<<endl;
i++;
}
}
,输出就是这个。
hello A B by
h
hello A B
hello A B by
b
by
在输出的第1行,第4行和第6行末尾有一些垃圾值。
当我对tokenized1[1]
进行记忆复制时,为什么tokenized1[0]
被改变了?以及如何解决这个问题?
答案 0 :(得分:5)
以下new
电话中有几个错误。你需要使用方括号;此外,争论还有一个。
lstring=new char[strlen(tokenized1[i]) + 1];
如果没有方括号,则为一个字符分配空间。结果,memcpy()
写入了已分配的内存。
编辑:我刚注意到其他new
,这也需要修复:
input=new char[s.size() + 1];
最后,s[i]
读取字符串末尾的结尾:
for(i=0;i<=s.size();i++)
input[i]=s[i];
可能还有其他错误,更不用说内存泄漏......
答案 1 :(得分:0)
您似乎没有终止'输入'
答案 2 :(得分:0)
除了NPE所说的,还有其他几件小事:
char *input;
input=new char(s.size());
这可能与它有关 - 您正在分配单个字符。然后编写一个字符,并覆盖用于who-know-what的其他内存。试试这个:
char *input = new char[s.size() + 1];
另一个问题是你的循环,紧接着它:
for(i=0;i<=s.size();i++)
input[i]=s[i];
至少在我的系统上,使用偏移量等于s.size()的std :: string :: operator []失败;我不知道你的具体实现,但我很好,它也失败了。保持安全,而不是抱歉,并重新编码你的循环:
for(i = 0; i < s.size(); i++)
input[i] = s[i];
input[i] = 0;
我希望这会有所帮助。