[C++] strfry() Zugriff auf Array - Segfault

The Prophet

Rear Admiral
Dabei seit
Aug. 2001
Beiträge
5.981
Servus,

heute hab ich auch mal ein anliegen. Versuche mich derzeit mal wieder ein wenig an C++.
Folgendes Programm liegt vor:

funktionierende Variante
Code:
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int main() {
        char Zeichen[]={"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"};
        cout << "Anzahl Zeichen im String: " << sizeof(Zeichen)<< endl;
        strfry (Zeichen);
        cout << Zeichen << endl;
Variante mit Segfault
Code:
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int main() {
        char Zeichen[]={'0','1','2','3','4','5','6','7','8','9'};
        cout << "Anzahl Zeichen im String: " << sizeof(Zeichen)<< endl;
        strfry (Zeichen);
        cout << Zeichen << endl;
Warum die 2te Variante nicht so funktioniert ist mir eigentlich klar, da strfry() laut man einen String erwartet. Ich suche nun also eine Variante um dennoch auf einen Array zuzugreifen. Desweiteren suche ich eine Möglichkeit den String/Array abzuschneiden, um z.B. nur 10 oder 20 Zeichen auszugeben.
 
Zuletzt bearbeitet:

Aral

Ensign
Dabei seit
Juli 2006
Beiträge
227
Also ich hab jetzt 2 minuten nachgedacht was du mit deinen letzten 2 Saetzen meinst. Schreib doch mal in richtigem Deutsch.
 

The Prophet

Rear Admiral
Ersteller dieses Themas
Dabei seit
Aug. 2001
Beiträge
5.981
Hab es mal editiert, war vorhin beim schreiben wohl geistlich etwas zu weit...
 

Boron

Commander
Dabei seit
Sep. 2001
Beiträge
2.784
Vielleicht ist es ein fehlendes '\0' in Variante 2?
Denn alle Strings die mit den Gänsefüßchen erstellt werden (siehe Variante 1) werden automatisch mit einem \0 terminiert.

Andererseits:
Warum nutzt du C-Funktionen wenn du C++ programmieren willst?
Was auch immer strfry macht, es gibt bestimmt ein C++ Äquivalent.
 

The Prophet

Rear Admiral
Ersteller dieses Themas
Dabei seit
Aug. 2001
Beiträge
5.981
Danke Boron das klappt soweit.
Habe strfry() als Windos randomize() äquivalente Funktion benutzt. Kenne keine andere Funktion um einen String mehr oder minder sinnfrei zu mixen.
 

Raechaer

Lt. Junior Grade
Dabei seit
Aug. 2004
Beiträge
277
Wie wär's mit random_shuffle() anstatt strfry()?

Code:
#include <algorithm>
#include <iostream>

using namespace std;

int main()
{
	char Zeichen[]={"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"};
	random_shuffle(Zeichen, Zeichen+strlen(Zeichen));

	cout << Zeichen << endl;
}
 

The Prophet

Rear Admiral
Ersteller dieses Themas
Dabei seit
Aug. 2001
Beiträge
5.981
@ Raechaer

schöne Funktion aber leidert liefert sie bei mir zur Laufzeit immer das selbe Ergebnis.

Momentan hab ich das Problem so gelöst:
Code:
#include <string.h>
#include <iostream>
using namespace std;

//Globale Struktur Key
struct KEY {
	unsigned int length;
};

//Initialisierung der Key Variable
void Init (KEY& K, unsigned int l) {
	int i,n;
	char chars[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J',
                	      'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d',
	               	      'e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x',
			      'y','z','%','!','#','&','$','*','~','\0'};
	
	K.length = l;
	for(i=0;i<l;i=i++)        
	{                
		strfry(chars);
		//random_shuffle(chars, chars+strlen(chars));
		cout << chars[i];
		        
	}
	cout << endl << endl; 

}
int main() {
	KEY Wep64, Wep128, Wep64hex, Wep128hex, Wpa, Wpa2; /*TODO hex Implementierung */
	cout << "WEP Key 64 Bit  -> 5 Zeichen ASCII: \n"; 	        Init(Wep64,5);
	cout << "WEP Key 128 Bit -> 13 Zeichen ASCII: \n"; 	Init(Wep128,10);
	cout << "WPA2 Key: \n"; 				                Init(Wpa2,63);
	return 0;
}
Der ein oder andere wird erkennen was es werden soll.
 

Raechaer

Lt. Junior Grade
Dabei seit
Aug. 2004
Beiträge
277
Wenn du bei jedem Aufruf eine andere Reihenfolge haben willst kannst du das z.B. so machen (Beispiel mehr oder weniger aus MSDN kopiert):

Code:
#include <algorithm>
#include <iostream>
#include <functional>
#include <ctime>

using namespace std;

// return an integral random number in the range 0 - (n - 1)
int Rand(int n)
{
    return rand() % n ;
}

int main()
{
	srand( (unsigned)time( NULL ) );

	char Zeichen[]={"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"};
	random_shuffle(Zeichen, Zeichen+strlen(Zeichen),pointer_to_unary_function<int, int>(Rand));

	cout << Zeichen << endl;
}
Falls du auf diese Weise zufällige Schlüssel/Passworter bestimmen willst solltest du aber beachten, dass bei dir jedes Zeichen nur einmal vorkommen kann.
 

The Prophet

Rear Admiral
Ersteller dieses Themas
Dabei seit
Aug. 2001
Beiträge
5.981
Mein gcc tut sich ein wenig schwer an der folgenden Zeile:
Code:
random_shuffle(Zeichen, Zeichen+strlen(Zeichen),pointer_to_unary_function<int, int>(Rand));
Und die Fehlermeldung isagt mir derzeit noch nix:
Code:
keine passende Funktion für Aufruf von »random_shuffle(char [63], char*, std::pointer_to_unary_function<int, int>)«
/usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/g++-v4/bits/stl_algo.h:1925: Anmerkung: Kandidaten 
sind: void std::random_shuffle(_RandomAccessIterator, _RandomAccessIterator, _RandomNumberGenerator&) 
[with _RandomAccessIterator = char*, _RandomNumberGenerator = std::pointer_to_unary_function<int, int>]
 
Zuletzt bearbeitet:

Raechaer

Lt. Junior Grade
Dabei seit
Aug. 2004
Beiträge
277
Versuch's stattdessen mit
Code:
random_shuffle(Zeichen, Zeichen+strlen(Zeichen),Rand);
Habe allerdings keinen gcc installiert, also keine Ahung ob's funktioniert.
 

The Prophet

Rear Admiral
Ersteller dieses Themas
Dabei seit
Aug. 2001
Beiträge
5.981
Damit funktioniert es, allerdings auch nur in einem Testprogramm. In meinem kleinen Programm erzeugt er wie zuvor nur einen "Schlüssel" zur Laufzeit.
 

The Prophet

Rear Admiral
Ersteller dieses Themas
Dabei seit
Aug. 2001
Beiträge
5.981
Ich bin heute verdammt schusselig. So funktioniert es natürlich. Merkwürdigerweise verwendet er für alle 3 Funktionsaufrufe aber immer den selben "Schlüssel". Aber das liegt sicherlich an der srand Funktion (3 Funktionsaufrufe in einer Sekunde)?

Danke
 

The Prophet

Rear Admiral
Ersteller dieses Themas
Dabei seit
Aug. 2001
Beiträge
5.981
Habe ich eigentlich gemacht. Aber was ich meine ist das:
Code:
WEP Key 64 Bit  -> 5 Zeichen ASCII:
o*V5j

WEP Key 128 Bit -> 13 Zeichen ASCII:
o*V5j)4n5O

WPA2 Key:
o*V5j)4n5O6qI8ApwPu3(1VzPJ7k7Q!z(Y#%!fE%RbjxZCe0WwJIR0^BIMbxb9T
Es wird zur Laufzeit wohl nur ein Schlüssel erzeugt, obwohl es 3 Funktionsaurufe gibt. Ich denke mal das liegt daran da es innerhalb einer Sekunde erfolgt.
 

Raechaer

Lt. Junior Grade
Dabei seit
Aug. 2004
Beiträge
277
Also Folgendes funktioniert bei mir:
Code:
#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;

//Globale Struktur Key
struct KEY {
	unsigned int length;
};

int Rand(int n)
{
    return rand() % n ;
}

//Initialisierung der Key Variable
void Init (KEY& K, unsigned int l) 
{
	unsigned int i;
	char chars[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J',
                	      'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d',
	               	      'e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x',
			      'y','z','%','!','#','&','$','*','~','\0'};
	
	K.length = l;
	for(i=0;i<l;i=i++)        
	{                
		random_shuffle(chars, chars+strlen(chars),Rand);
		cout << chars[i];
		        
	}
	cout << endl << endl; 

}
int main() 
{
	srand( (unsigned)time( NULL ) );

	KEY Wep64, Wep128, Wpa2; /*TODO hex Implementierung */
	cout << "WEP Key 64 Bit  -> 5 Zeichen ASCII: \n"; 	        Init(Wep64,5);
	cout << "WEP Key 128 Bit -> 13 Zeichen ASCII: \n"; 	Init(Wep128,10);
	cout << "WPA2 Key: \n"; 				                Init(Wpa2,63);
	return 0;
}
 

The Prophet

Rear Admiral
Ersteller dieses Themas
Dabei seit
Aug. 2001
Beiträge
5.981
Danke, funktioniert nun prächtig. Der Fehler lag tatsächlich an der srand() Funktion.

//Edit - 07.12.06
Habe nun versucht die Ausgabe in Hexadezimal umzuwandeln, allerdings stimmt das Ergebnis bei weitem nicht:
Code:
int ausgabe(KEY& K, unsigned int l, bool tohex) {
        unsigned int i;
        char chars[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J',
                              'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d',
                              'e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x',
                              'y','z','%','!','#','&','$','*','~','?','\0'};
        
        K.length = l;
        for(i=0;i<l;i++)        
        {                
                random_shuffle(chars, chars+strlen(chars),Rand);
                cout << chars[i];
                
        }
	    cout << endl << endl;
	  
        [color=red]Hex Ausgabe Ja/Nein - wenn ja dann gib es aus.[/color]
        if(tohex){
        for (i=0;i<l;i++)
	    {
                 cout << hex << static_cast<int>(chars[i]);
	    }
        }
        else 
        cout << "kein hex wert";        
	cout << endl << endl;

}
 
Zuletzt bearbeitet:

Raechaer

Lt. Junior Grade
Dabei seit
Aug. 2004
Beiträge
277
Bei der ASCII Ausgabe "shufflest" du dein Array nach jedem Zeichen erneut, beim Ausgeben als Hex benutzt du dann aber nur das letzte Array.
Ändere mal
Code:
for(i=0;i<l;i++)        
{                
     random_shuffle(chars, chars+strlen(chars),Rand);
     cout << chars[i];        
}
in
Code:
random_shuffle(chars, chars+strlen(chars),Rand);
for(i=0;i<l;i++)        
{                
    cout << chars[i];
}
 

The Prophet

Rear Admiral
Ersteller dieses Themas
Dabei seit
Aug. 2001
Beiträge
5.981
So einfach und doch nicht darauf gekommen. Danke!
 
Top