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]II が の memcopy を実行したときに変更されたのはなぜtokenized1[0]ですか? これを解決する方法は?

4

3 に答える 3

5

new次の呼び出しにはいくつかのバグがあります。角かっこを使用する必要があります。また、引数は 1 ずれています。

lstring=new char[strlen(tokenized1[i]) + 1];

角括弧がなければ、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

NPEが言ったことに加えて、他にもいくつかの小さなことがあります:

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

これには何か関係があるかもしれません - あなたは単一の文字を割り当てています。次に、その 1 文字を書き込み、誰が何を知っているかを示すために使用される他のメモリを上書きします。代わりにこれを試してください:

char *input = new char[s.size() + 1];

別の問題は、そのすぐ下のループです。

for(i=0;i<=s.size();i++)
        input[i]=s[i];

少なくとも私のシステムでは、 std::string::operator[] を s.size() に等しいオフセットで使用すると失敗します。あなたの特定の実装についてはわかりませんが、それも失敗します。申し訳ありませんが、次のようにループを再コーディングしてください。

for(i = 0; i < s.size(); i++)
    input[i] = s[i];

input[i] = 0;

これが役立つことを願っています。

于 2012-12-06T18:47:42.483 に答える
0

「入力」をゼロで終了しているようには見えません

于 2012-12-06T18:36:16.593 に答える