Zwracanie tablicy przez funkcje

0
char *znak(int t)
 {

      char  d;
      String b;
      char tab[t];
      for (int i=0; i<t; i++)
      {
          int a = (rand() % 34);
      ifstream plik("ltr.txt");
      plik.seekg(+a);
     plik>>d;
     tab[i]=d;
      plik.close();
      }
      return tab;
}

Taka funkcje mam i ona robi to co ma robic ... z tym ze na koncu pojawia sie tajemnicza literka "u" ktora jest absolutnie nie potrzebna a wrecz ponadprogramowa. jak zrobic zeby ona sie nie pojawiala?

1

Nie możesz zwracać tablicy w taki sposób. Wszystkie zmienne, które powstają na stosie są po wyjściu z funkcji niszczone / nadpisywane. Użyj operatora new do stworzenia tablicy na stercie, a później delete do jej usunięcia. A jeszcze lepiej - użyj std::string.

Dodatkowy znak na końcu zapewne wynika z tego, że wyświetlasz swoją tablicę jako napis, który musi zakończyć się znakiem \0.
Niepotrzebnie również otwierasz i zamykasz plik z każdą iteracją pętli. Zrób to raz.

0

Wiesz mi chodzi o to zeby za kazdym razem ustawiac sie na poczatku pliku ... no ale faktycznie mozna to inaczej zrobic ... ale to nie ma znaczenia ... mi chodzi zeby tego u nie bylo...
A jak mam zastosowac new w tym wypadku?

0
 char *znak(int t)
 {

      char  d;
      char *b;

      b = new char[51];
      ifstream plik("ltr.txt");
      for (int i=0; i<t; i++)
      {
          int a = (rand() % 34);

      plik.seekg(+a);
      plik>>d;
      *(b+i)=d;

      }
        plik.close();
                return b;
                delete []b;
}

przerobilem na cos takiego ... przy podaniu wartosci t=6 dziala elegancko ale przy podaniu wartosci t=4 na koncu (po 4 znakach) pojawia sie smiec.....

1

Proponuję poczytać o c-stringach, funkcjach, wskaźnikach, new, delete i return, bo najwyraźniej nie masz pojęcia co return robi.
Formatowanie kodu - okrutne
Nazewnictwo zmiennych - też nie najlepiej(proponuję używać języka angielskiego).

To Twoje delete nigdy się nie wykona - masz wyciek pamięci.

char* jakasSensownaNazwa(int count)
{
    const int JAKAS_SENSOWNA_NAZWA_2 = 34; //nie używaj magic numbers!
    char *text = new char[count];
    char c;
    int i;

    ifstream file("ltr.txt");
    for(i = 0; i < count; i++)
    {
        int pos = rand() % JAKAS_SENSOWNA_NAZWA_2;
        file.seekg(pos);
        file >> c;
        text[i] = c;
    }
    file.close();

    text[i] = '\0';
    return text;
}

//używając musisz pamiętać o delete gdy już to co zwróciła funkcja nie będzie Ci potrzbne!!!
...
char *whatever = jakasSensownaNazwa(5);
cout << whatever << "\n";
delete [] whatever;
...

1 użytkowników online, w tym zalogowanych: 0, gości: 1