0

我有这样的代码。你能告诉我为什么它的行为不像我预期的那样吗?

/*
 * 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]做 memcopy of 时被改变了tokenized1[0]?以及如何解决这个问题?

4

3 回答 3

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];

很可能还有其他错误,更不用说内存泄漏......

于 2012-12-06T18:35:40.447 回答
0

您似乎不是零终止“输入”

于 2012-12-06T18:36:16.593 回答
0

除了 NPE 所说的,还有一些其他的小事:

char *input;
input=new char(s.size());

这可能与它有关 - 您正在分配一个字符。然后,您写入该字符,并覆盖用于“谁知道”的其他内存。试试这个:

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;

我希望这有帮助。

于 2012-12-06T18:47:42.483 回答