2012-12-06 29 views
0

我有這樣的代碼。你能告訴我爲什麼它不像我預期的那樣行事嗎?爲什麼memcpy會改變字符串數組?

/* 
* 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]的記錄?以及如何解決這個問題?

+1

2分:1)我真的不明白爲什麼這個問題被標記爲c和C++。從代碼看它幾乎是C++。 2)當使用C++時,爲什麼要使用'memcpy',手動內存管理,'strlen'等而不是'std :: copy'和'std :: string'上的操作? – Grizzly

回答

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

有很可能是其他的錯誤,更不用說內存泄漏了......更不用說內存泄漏了......

+0

that did not work :(同樣的結果 –

+0

是的,那工作!!!謝謝..... :) –

0

你似乎不是零終止'輸入'

+0

仍然結果相同 –

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

我係統,使用的std :: string :: operator []的至少上偏移等於到s.size()失敗;我不知道你的具體實現,但我相當失敗。安全,而不是遺憾,並重新編碼你的循環因此:

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

input[i] = 0; 

我希望這可以幫助。

+0

非常感謝你回答..它爲我工作。 –

+0

太棒了!祝你好運。 –

相關問題