C++ String 0-terminieren

Karambo

Ensign
Registriert
Feb. 2008
Beiträge
131
Hallo!

Ich habe in meinem Programm einen char-Array ( [2] ), welches ich in einen String kopieren muss. In char [0] ist z.B. '3', in char [1] z.B. 'a'. Nun schreibe ich:
string = char; (ohne Array-Index; Namen dienen zur Vereinfachung)
Da anscheinend noch Reste vom Arbeitsspeicher in den String mit einfließen, kommt etwas wie "3a||||||0fdgkjh" raus (bei cout -> String).
Da ich aber nur zwei Zeichen vom String benötige, kommt es zu Fehlern.

Hintergrund: Ich benutze die Funktion: system(("color " + string).c_str () ), wo ich logischerweise 2 Hexadezimalzeichen benötige.



Karambo
 
Pack halt an Index 2 des Strings ein '\0'. Wo ist das Problem?
 
Wo du doch eh schon std::string nutzt, mußt du in deinem Programm überhaupt noch mit char-Arrays rumeiern? Warum beschreibst du dein string-Objekt nicht einfach direkt, statt einen Umweg über ein char-Array zu gehen?
 
omg... meine vorredner haben recht, btw. gibts ja wohl hunderte bessere foren für software entwicklungs fragen
 
Ich benutze char, weil ich eine zusätzliche Funktion geschrieben habe, die die einzelne Character darauf überprüft, ob sie im Hexadezimalen Bereich liegen. Sonst würde ich auch liebend gerne mit Strings arbeiten ;).
Habe jetzt char [3], wobei ich in char [2] jetzt '\0' geschrieben habe. Jetzt wird das Array in den String kopiert und auch korrekt angezeigt.
 
Karambo schrieb:
Ich benutze char, weil ich eine zusätzliche Funktion geschrieben habe, die die einzelne Character darauf überprüft, ob sie im Hexadezimalen Bereich liegen. Sonst würde ich auch liebend gerne mit Strings arbeiten ;).

Aber das kannst du doch mit einem std::string-Objekt genau so machen.


Code:
bool allCharsAreHexDigits( const std::string& input )
{
	for ( std::string::const_iterator it = input.begin(); it != input.end(); ++it )
	{
		// Mit *it kommst du an das jeweilige char ran ... hier kannst du dann deine checks implementieren und mit false aus der Funktion rausspringen
		// oder unter der Schleife mit true aus der Funktion rausgehen.
	}
	
	return true;
}
 
für das Initialisieren kannst du folgenden ctor nehmen

string ( const char * s, size_t n );

n ist dabei die Länge des const char* strings.

Das Prüfen auf der einzelnen Zeichen gegen den Bereich 0-9a-fA-F ginge dann mittels

s.find_first_not_of("0123456789abcdefABCDEF") == std::string::npos

Konkretes Beispiel:
Code:
#include <iostream>
#include <string>

int main() {
	char a[2] = {'A', 'S'};

	std::string s(a, 2);

	if(s.find_first_not_of("0123456789abcdefABCDEF") != std::string::npos)
	  std::cerr << s << " ist keine hexadezmale Zahl\n";
}
 
Zuletzt bearbeitet: (AUsdruck + Beispiel)
convexus schrieb:
Das Prüfen auf der einzelnen Zeichen gegen den Bereich 0-9a-fA-F ginge dann mittels

s.find_first_not_of("0123456789abcdefABCDEF") == std::string::npos

Stimmt; das ist sogar noch besser. Hatte ich gar nicht dran gedacht. :)
 
convexus schrieb:
für das Initialisieren kannst du folgenden ctor nehmen

string ( const char * s, size_t n );

n ist dabei die Länge des const char* strings.

Das Prüfen auf der einzelnen Zeichen gegen den Bereich 0-9a-fA-F ginge dann mittels

s.find_first_not_of("0123456789abcdefABCDEF") == std::string::npos

Wenns nur kurze Zeichenketten sind und das nur selten aufgerufen wird ok. Aber wenns oft genutzt wird oder die Zeichenketten lang werden dann kriegst du hier schnell ein Performanceproblem.
Da wäre die Schleifenlösung und dann mit if, switch oder isxdigit() besser geeignet.
 
ich bin kein Fan von expliziten Schleifen und verwende wenn es geht lieber std::for_each, std::find_if usw.

Code:
#include <algorithm>
#include <cctype>
#include <functional>
#include <iostream>
#include <string>

struct Is_Hexdigit : public std::unary_function<char, bool> {
	bool operator()(char c) const {
		return std::isxdigit(c) != 0;
	}
};

int main() {
	char a[2] = {'A', 'F'};
	std::string s(a, 2);

	if(std::find_if(s.begin(), s.end(), std::not1(Is_Hexdigit())) != s.end())
		std::cerr << s << " ist keine hexadezmale Zahl\n";

        // mit c++11 griffiger, g++ -std=c++0x 
	if(!std::all_off(s.begin(), s.end(), Is_Hexdigit()))
		std::cerr << s << " ist keine hexadezmale Zahl\n";
}
 
Zuletzt bearbeitet: (find_if Variante korrigiert & Anpassungen)
Zurück
Oben