• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie SPOJ łamanie hasła do gg

0 głosów
1,829 wizyt
pytanie zadane 1 kwietnia 2016 w C i C++ przez Szahid Pasjonat (20,970 p.)

1. 

Jak mam przekazać 6 elementowego stringa do funkcji main ? Żeby to lepiej zobrazować podaje kod. W komentarzu napisze gdzie mi wywala błąd. ( przy okazji prosze o wyjaśnienie dlaczego tak nie można) 

2. Dlaczego nie moge wyświetlić zmiennej haslo poprzez cout<<haslo; ? Kiedy tak robie nie wyświetla się nic ( w funkcji rozkodowującej i w mainie) . Jednak kiedy chce wyświetlić tylko jedną litere hasła to już jest ok ( np haslo jest ABCDE i  cout<<haslo[1]; wyswietla mi sie B) ( tak jest tylko w funkcji rozkodowującej bo w mainie nie pokazuje nic) . Jak mam to naprawić żeby wyświetlało się całe ( nie chce wyświetlać poszczególnych liter w pętli bo na pewno jest jakiś mniej toporny sposób. ( ma się wyświetlać w funkcji main). Mam próbować zalokować dynamicznie tego stringa i przekazać go do funkcji main czy moge jakoś użyć return ? 

 

3. Chce żeby mój program  wyszukiwał na dysku plik z rozszerzeniem .dat ( pędzie podana tylko nazwa, i dysk na którym się znajduje) , kopiował go i konwertował na .txt. Nie mam jeszcze wiedzy jak to zrobić . O czym powinienem poczytać żeby coś takiego zrobić? 

 

//FUNKCJA Z KTÓREJ ZWRACAM SZEŚCIO ELEMENTOWEGO STRINGA 

string rozkoduj(const string rawhaslo,values tab1[],values tab2[])
{

 string haslo;
 int dlugosc= rawhaslo.length();
 int j=0;
 int temporary;
 int licznik;


 for ( int i=0;i<dlugosc;i+=2,j++)
 {
     temporary=0;
      licznik=0;
     while(rawhaslo[i]!=tab1[licznik].znak)
     {
         licznik++;
     }
     temporary+=tab1[licznik].wartosc;
     licznik=0;

     while (rawhaslo[i+1]!=tab2[licznik].znak)
     {
         licznik++;
     }

     temporary+=tab2[licznik].wartosc;

     haslo[j]=char (temporary);




 }



return haslo; 




}

// Funkcja main gdzie chce wyswietlic 
string haslo[6];
haslo=rozkoduj(rawhaslo,tab1,tab2);// error: incompatible types in assignment of 'std::string {aka std::basic_string<char>}' to 'std::string [6] {aka std::basic_string<char> [6]}'|
cout<<haslo;



  

 

 

 

3 odpowiedzi

+1 głos
odpowiedź 1 kwietnia 2016 przez lambda16 Początkujący (400 p.)

Standard języka C++ pozwala jedynie na użycie dwóch wersji funkcji main():
int main()

{

     ...

}

 

oraz

 

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

{

   ...

}

 

Nie powinieneś tak robić :)
W linijce 48 tworzysz tablice stringów, nie stringa, nie ma odpowiedniej konwersji z 

std::string [6] {aka std::basic_string<char> [6] do std::string aka std::basic_string<char>

tak jak napisał kompilator.

Jakbyś udostępnił cały kod to łatwiej byłoby ci pomóc.

komentarz 1 kwietnia 2016 przez Szahid Pasjonat (20,970 p.)
Racja :)

Dziękuje
+1 głos
odpowiedź 1 kwietnia 2016 przez mariush Dyskutant (7,860 p.)

W funkcji rozkoduj tworzysz stringa hasło, nie przypisując mu żadnej wartości. Zostaje wywołany domyślny konstruktor klasy string, który ustawia jego długość na 0 (linia 6). Następnie próbujesz uzyskać dostęp do znaku tego ciągu tekstowego na jakiejś pozycji j (linia 31), z tym że ten string ma długość 0.

Rozwiązanie 1:

Jeśli znasz ile elementów będzie w stringu to możesz mu zmienić rozmiar za pomocą funkcji resize();

haslo.resize(długość);

Rozwiązanie 2:

Z racji, że i tak każdy z tych znaków będzie dodawany na końcu możesz zamienić linijkę:

haslo[j] = char(temporary);
//na tą
haslo += char(temporary);

 

komentarz 1 kwietnia 2016 przez Szahid Pasjonat (20,970 p.)
A czy moge stworzyć takiego stringa -

string haslo[6]; ( w meijsce lini 6 )

Czy jest to jednoznaczne z Rozwiązniem 1 ?

 

Rozumiem że rozwiązanie 2 tyczy się zupełnie innego zagadnienia niż rozwiązanie 1. Nie myle się ? ( wersja alternatywna żeby pozbyć się ziennej j)
komentarz 1 kwietnia 2016 przez mariush Dyskutant (7,860 p.)

string hasło[6] stworzy ci tablicę zawierającą 6 obiektów string. Jeśli chcesz to możesz to też zrobić w taki sposób:

string haslo(6, 'a');

To stworzy stringa haslo i wypełni go 6 literami a, które potem i tak zmieniasz w pętli.

Drugie rozwiązanie po prostu dokleja znak na końcu stringa.

+1 głos
odpowiedź 1 kwietnia 2016 przez lambda16 Początkujący (400 p.)

Odpowiedź na pytanie 3

Na początku poucz się o wejściu/wyjściu i ogólnie o iostream. Aby zmienić rozszerzenie pliku po prostu go zapisz z takim rozszerzeniem jakie chcesz mieć w pliku wyjściowym, jeśli ma mieć jakąś specjalną strukturę to o niej się dowiedz. Poczytaj też o trybie std::ios::binary, często okazuje się użyteczny w wczytywaniu plików. Powyższe zagadnienia powinna tłumaczyć każda dobra książka o C++ (Szkoła programowania, Symfonia, patrz książki warte uwagi na tej stronie). Na koniec sprawdź jak przeszukać dysk w poszukiwaniu pliku, google i popularne fora programistyczne mają dużo takich, już gotowych rozwiązań.

Podobne pytania

0 głosów
1 odpowiedź 433 wizyt
0 głosów
3 odpowiedzi 2,010 wizyt
pytanie zadane 4 listopada 2021 w Bezpieczeństwo, hacking przez Oliwer Nowicjusz (160 p.)
0 głosów
1 odpowiedź 1,196 wizyt
pytanie zadane 26 października 2020 w Bezpieczeństwo, hacking przez kondzix_ez Obywatel (1,930 p.)

93,776 zapytań

142,736 odpowiedzi

323,388 komentarzy

63,381 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...