Losowanie łańcucha znaków C

0

Napisałem funkcję, która w teorii powinna losować łańcuchy znaków C. Funkcja działa, jednak kiedy wywołam ją np. 3 razy pod rząd, to dostaję 3 razy ten sam łańcuch. srand() jest w mainie.

char* rndchar(){
	char temp[7];
	for(int j=0; j<6; j++){
		temp[j]='A'+rand()%26;
	}
	return temp;
}

Gdzie znajduje się błąd?

1

Ja tutaj widzę co najmniej 2 błędy:
po 1 primo zwracasz wskaźnik do lokalnej zmiennej temp
po 2 primo nie konczysz zwracanego łańcucha zerem.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define SIZE 10

void randstring(char *s, unsigned size)
{
	int i;
	for(i=0; i<size-1; ++i)
	{
		s[i] = 'A' + rand()%26;
	}
	s[++i] = '\0';
}


int main(int argc, char const *argv[])
{
	/* code */
	srand(time(0));
	char str[SIZE];
	for(int i=0; i<5; ++i)
	{
		randstring(str, SIZE);
		printf("%s\n", str);
	}
	return 0;
}

oczywiście ja również mogłem coś przeoczyć ale mam nadzieję, że tak się nie stało.

0

Potrzebuję funkcji, która zwraca losowy łańcuch, a nie zapisuje go do podanej zmiennej

0

Potrzebuję funkcji, która zwraca losowy łańcuch, a nie zapisuje go do podanej zmiennej. Po dodaniu linijki, która kończy łańcuch zerem, nadal zwraca te same łańcuchy.

0

memcpy i odpowiedni zwracany typ

0

Nadal niezbyt rozumiem.

0
eilchner napisał(a):

Nadal niezbyt rozumiem.

Pamięć którą zwracasz jest już po terminie waznosci

0
eilchner napisał(a):

Potrzebuję funkcji, która zwraca losowy łańcuch, a nie zapisuje go do podanej zmiennej.

Wersja od twara zmieniona na potrzeby ww wymagania:

char *randstring(char *s, unsigned size)
{
    int i;
    for(i=0; i<size-1; ++i)
    {
        s[i] = 'A' + rand()%26;
    }
    s[++i] = '\0';
    return s;
}

W C++ można zrobić trochę wygodniej - bez argumentu wejściowego "s", ale będzie to wolniejsze.

0

Program jest w C++, tylko potrzebuję też, oprócz funkcji losującej stringi (to już mam), funkcję do łańcuchów char. Jak można to zrobić bez argumentu wejściowego?

0

Podziałało. Wystarczyło dać

char *temp;
temp=new char[7];

zamiast

char temp[7];

Możesz mi wyjaśnić, dlaczego mój sposób nie działał, a ten już tak? Z czystej ciekawości

1

Przy tej drugiej wersji zawartość pamięci "znika" po wyjściu z funkcji losującej.
Przy pierwszej wersji nie zapomnij o użyciu "delete []" po skonsumowaniu wyniku.

0
eilchner napisał(a):

Program jest w C++, tylko potrzebuję też, oprócz funkcji losującej stringi (to już mam), funkcję do łańcuchów char. Jak można to zrobić bez argumentu wejściowego?

W takim razie używaj std::string by uniknąć problemów z pamięcią (przy twoich obecnych umiejętnościach będzie lepiej jak zrezygnujesz z ręcznego zarządzania pamięcią).

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