2016-10-12 5 views
0

私はファイルから動的に割り当てられた構造体の配列に読み込む必要がある学校の割り当てを行っています。すべての配列に対してCスタイルの文字列とポインタ配列構文(*(ポインタ+ x))しか使用できません。私はすべてを自分の場所にロードしようとしているところまで行きましたが、私がこれをすると、という単語の末尾にゴミ箱が常にあります。という変数です。この問題を解決するにはどうすればよいですか?私はC文字列の最後に余分な文字を続けています

#include <iostream> 
#include <fstream> 
#include <cstdlib> 

using namespace std; 

struct Pieces 
{ 
    char* word; 
    int jump; 
}; 

void reset(char*, int); 
int strLen(char*); 
void createArr(char*, char*); 

int main() 
{ 
    Pieces* cip; 
    char* temp; 
    ifstream input; 
    int numWords, numKeys; 

    temp = new char[20]; 
    input.open("Project4Data.txt"); 
    input >> numWords; 
    input >> numKeys; 
    cip = new Pieces[numWords]; 
    for(int x = 0; x < numWords; x++) 
    { 
     int tempSize; 
     reset(temp, 20); 
     input >> temp; 
     tempSize = strLen(temp); 
     //cout << temp << " "; 
     (cip + x)->word = new char[tempSize]; 
     //cout << tempSize; 
     reset((cip + x)->word, tempSize); 
     createArr((cip + x)->word, temp); 
     input >> (cip + x)->jump; 
     //cout << (cip + x)->word<< << endl; 
    } 
    input.close(); 

    //cout << (cip + 2)->word; 
    delete[] cip; 
    return 0; 
} 

int strLen(char* word) 
{ 
    int s = 0; 
    //cout << word; 
    for(int x = 0; *(word + x) != '\0'; x++) 
     s++; 
    return s; 
} 

void reset(char* arr, int size) 
{ 
    for(int x = 0; x < size; x++) 
     *(arr + x) = '\0'; 
} 

void createArr(char* a, char* b) 
{ 
    reset(a, strLen(b)); 
    for(int x = 0; x < strLen(b); x++) 
     *(a + x) = *(b + x); 
     cout << a; 
} 

Iは(CIP + X)送信 - - TEMPの有効な内容は(CIP + X)にコピーすることができるようにcreateArrに>ワードTEMPを> word*(cip + x) - > wordは、私がヌルにすべてを設定して最初のカップルのインデックスのみを使用しているにもかかわらず、最後にゴミのゴミが常に出てきます。これをどうやって解決するのですか?

のJava 2 linuxの3恐怖0プール2 0赤1錠の操作を行います。

データファイルは、その上にこの情報を持っています。 1 0ランダム2台のコンピュータ、0は0ではない0のオープン2台の車! 2 C、0 0は0犬1緑2 C++ 0瓶2は間違っている、2個。 0

+1

createArr' 'は' X <= STRLEN(b)は '0-チャーターミネーターをコピーすると行きます。あるいは 'for'サイクルの最後に' *(a + strLen(b))= 0'を挿入します。もちろん、 'a'に十分なスペースがあり、' b'の長さが必要なたびに反復するのではなく、 'b'の長さを格納するためにローカルvarを使う方が良いです。 –

答えて

0

Cスタイルの文字列はnullで終端されているため、最後の印刷可能文字の後の文字は0または '\ 0'になる必要があります。 ループの後でこれを手動で設定することもできますし、Adrianが「以下」より小さい値を指定して置き換えることもできます。

void createArr(char* a, char* b) 
{ 
    reset(a, strLen(b)); 
    for(int x = 0; x < strLen(b); x++) 
     *(a + x) = *(b + x); 
     *(a + x) = *(b + x); 
     cout << a; 
} 
(おそらくすっきり)

又は

void createArr(char* a, char* b) 
    { 
     reset(a, strLen(b)); 
     for(int x = 0; x <= strLen(b); x++) 
      *(a + x) = *(b + x); 
      cout << a; 
    } 
関連する問題