Я продолжаю получать значения мусора в массиве, которые были изменены из другого массива, в функции - PullRequest
1 голос
/ 09 апреля 2011

Я немного новичок в программировании, поэтому ответ на мою проблему не стал очевидным, хотя я пытался выполнить задачу несколькими способами.

Проблема в том, что я пытаюсь взять массив слов, удалить любые знаки препинания из массива и поместить новые слова в отдельный массив. Я пытался сделать это, но продолжаю получать значения мусора при выводе нового массива.

Код гласит:

norm(sepwords1,sepwords2,numwords);      <- where I called it in main

void norm(string words[], string wordz[],int count)       
{

        int i;
        int x;

        string newstring="";
        char current;


    for(i=0; i<count; i++)
        {
        for(x=0; x<words[i].length();x++)
        {        
          current= words[i].at(x);
                if(ispunct(current)==0)
                {
                newstring += current;
                }

        }        
                wordz[i]= newstring;
        }

}

полная основная функция:

int main (int argc, char* argv[])
{



int count = argc;
int i;
string filename[count];
ifstream infile;
string fromfile[1000];
int numdata;
int pass;
char current;
int sum;
string masterstring="";
int x;
string sepwords[2000];
int sum1;
string temp="";
int start;
int fin;
string newstring="";
string newfile[1000];
int place;
int numwords;
string sepwords1[2000];
string newmaster="";
int j=0;
string currentz;
string highmark;
int index[2000];
string sepwords2[2000];
int counta=0;

for(i=0; i < count-1; i++) 
{
filename[i] = argv[i+1];
}

for( i=0; i < count-1; i++)
    {
    infile.open(filename[i].c_str());

    numdata=0;  

    while(!infile.eof())
    {

    getline(infile, fromfile[numdata], '\n');
    numdata++;

    }





    for(i=0; i<numdata; i++)
    {
    cout<<fromfile[i]<<endl;
    masterstring += fromfile[i] + " ";                                      //NUMBER ONE
    }



    numwords = split(masterstring, sepwords);
    cout<<numwords<<endl;                                                       //NUMBER TWO


    }

    for(i=0;i<numwords;i++)
    {
        newstring = toupper(sepwords[i].at(0));         
        newstring += sepwords[i].substr(1);
        sepwords1[i] = newstring;
        newstring="";
    }

    for(i=0;i<numwords;i++)
    {


    newmaster += sepwords1[i] + " ";
       j++;
          if(j > 10)
          {
           newmaster+= '\n';
           j=0;
          }

    }
    cout<<newmaster<<endl;                                              //NUMBER THREE



    norm(sepwords1,sepwords2,numwords);

        for(i=0;i<numwords;i++)
    {
    cout<<sepwords2<<endl;
    }

return 0;
}

Ответы [ 3 ]

3 голосов
/ 09 апреля 2011

Ваш код должен работать, но, вероятно, есть проблема в основной функции, например, с вашими массивами и тем фактом, что вы должны использовать два, поэтому одной из причин, по которой я вижу такое поведение, может быть то, что размеры вашего массива не совпадаютдруг друга, и тот, в котором хранятся исходные строки, больше, чем тот, в который вы копируете.

#include <string>
#include <iostream>

int main() {
   const int SIZE = 5;
   string oldArray[SIZE] = {"He,llo", "Wor,ld", "H,ow", "Ar,e.", "Y,O,U"};
   string newArray[SIZE];

   for (int i = 0; i < 5; ++i) {
      // Moved this into the loop for ease, otherwise your
      // original code would have kept appending to this
      // newString variable unless you cleared it later
      std::string newString = "";
      for (int x = 0; x < oldArray[i].length(); ++x) {
            char current = oldArray[i].at(x);
            if (ispunct(current) == 0)
            {
               newString += current;
            }
      }
      newArray[i] = newString;
   }

   for (int i = 0; i < 5; ++i) {
      std::cout << newArray[i] << '\n';
   }
}

Это в основном ваш код, с несколькими изменениями, чтобы решить проблему конкатенации, сохраняющую newString вокругно без очистки позже.

Вы можете сделать эту проблему более кратко, используя материал std <algorithm> и <vector>, который будет обрабатывать рост и изменение размера для вас.

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

int main() {
    std::vector<std::string> stringsToCopy;
    stringsToCopy.push_back("Hel,lo,");
    stringsToCopy.push_back("th,ere.");

    // Make a copy of the other vector, since it seems like you want to keep
    // the original data. This will copy all the elements from the stringsToCopy
    // vector.
    std::vector<std::string> newStrings = stringsToCopy;

    // simplicity, but you could use an iterator as well, which would be
    // more verbose
    for (int i = 0; i < newStrings.size(); ++i) {
        // get a reference to the current string in the
        // vector for convenience, so we can use a shorter
        // name for it
        std::string& s = newStrings[i];

        // because remove_if doesn't actually delete things from a 
        // container, we should also call the string's erase method
        s.erase(std::remove_if(s.begin(), s.end(), ispunct), s.end());
    }


    for (int i = 0; i < newStrings.size(); ++i) {
        std::cout << newStrings[i] << '\n';
    }
}
0 голосов
/ 09 апреля 2011

Не уверен, что вы подразумеваете под выходом мусора?

Если я вызову вашу функцию с этим (g ++ 4.4.5)

#include <string>
#include <iostream>
using namespace std;
int
main  (int ac, char **av)
{
  int numwords = 3;
  string sepwords1[] = {"one,", "two", "three"};
  string sepwords2[numwords];
  norm(sepwords1,sepwords2,numwords);  
  for(size_t i=0;i<numwords;++i){
    std::cout<<"sepwords2["<<i<<"] = "<<sepwords2[i]<<std::endl;
  }

}

тогда я получаю вывод

sepwords2[0] = one
sepwords2[1] = onetwo
sepwords2[2] = onetwothree

Разве это не то, что вы хотите?

Если вам не нужна конкатенация, вам нужно сбросить переменную newword,

  wordz[i]= newstring;  //this is in your norm function 
  newstring="";         //this is the line I added. 

тогда вывод

sepwords2[0] = one
sepwords2[1] = two
sepwords2[2] = three
0 голосов
/ 09 апреля 2011

Массивы являются массивами фиксированного размера. Если вам нужно добавлять и удалять элементы из «массива», вы должны использовать список или вектор, которые представляют собой последовательности переменного размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...