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

The Prophet

Rear Admiral
Registriert
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:
Also ich hab jetzt 2 minuten nachgedacht was du mit deinen letzten 2 Saetzen meinst. Schreib doch mal in richtigem Deutsch.
 
Hab es mal editiert, war vorhin beim schreiben wohl geistlich etwas zu weit...
 
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.
 
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.
 
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;
}
 
@ 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.
 
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.
 
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:
Versuch's stattdessen mit
Code:
random_shuffle(Zeichen, Zeichen+strlen(Zeichen),Rand);

Habe allerdings keinen gcc installiert, also keine Ahung ob's funktioniert.
 
Damit funktioniert es, allerdings auch nur in einem Testprogramm. In meinem kleinen Programm erzeugt er wie zuvor nur einen "Schlüssel" zur Laufzeit.
 
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
 
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.
 
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;
}
 
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:
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];
}
 
So einfach und doch nicht darauf gekommen. Danke!
 
Zurück
Oben