Einfügen eines Char-Arrays in einen Vector



  • Hallo, ich hab mich jetzt schon öfter gefragt, wie ich ein char-Array als Kopie in einem Vector unterbringen kann:

    char acText[256];
    	std::vector<char[256]> daten;
    
    	for(int i = 0; i < 10; i++) 
    	{
    		sprintf(acText, "Zahl: %i", i);
    		daten.push_back(acText);
    	}
    
    	for(std::vector<char[256]>::iterator dIter2(daten.begin()); dIter2 != daten.end(); ++dIter2)
    	{
    		printf("%s\n", *dIter2);
    	}
    

    Wenn ich jedesmal mit new einen neuen char erzeuge habe ich es schon geschafft einen Text in einem Vector zu speichern, aber kann es nicht auch ohne new gehen, so ähnlich wie der Code oben? Das Problem ist nur, dass dieser Code nicht übersetzt wird, da er meint: "cannot convert from 'const char [256]' to 'char [256]'"
    Kann man da etwas ändern oder bleibt einem nichts anderes übrig als wieder auf new zurückzugreifen?

    Viele Grüße
    Andreas



  • Ich schlage vor Du benutzt std::vectorstd::string. Das ist sicherer, sauberer und einfacher.

    Simon



  • Gäbs denn trotzdem die Möglichkeit?



  • Ich glaube du musst den vektor dann so definieren: std::vector< char* > szVec

    das muesste gehen.

    Gruß Tobi.



  • Dann müsste ich aber doch wieder mit new arbeiten, weil sonst alle Einträge im Vector verändert werden, wenn ich acText verändere oder nicht?



  • Andreas_LL schrieb:

    Gäbs denn trotzdem die Möglichkeit?

    Ohne böse sein zu wollen: C-Arrays sind nicht so wie wir... ähhh... verhalten sich anders als normale Variablen. Die Variante mit den Zeigern würde funktionieren, auch wenn du dich dann Händisch die Allozierung und Deallozierung durchführen musst.

    Wenn du schon std::vector verwendest, nenn mir einen wirklich guten Grund gegen std::string

    cu André



  • Ein guter Grund gegen std::string? Es ist nicht halb so männlich. 😉 😃



  • ok meinetwegen, ich hab aber bisher noch nie mit dieser Art von Strings gearbeitet:
    std::vectorstd::string daten;
    allein diese Deklaration erzeugt 4 Warnungen:

    C:\Dokumente und Einstellungen\Andy\Desktop\zrsgsg\dsfsdf.cpp(33) : warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,std::basic_string<char,std::char_traits<char>,std::allocator<char>

    ,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,int>' : identifier was truncated to '255' characters in the debug information
    C:\Dokumente und Einstellungen\Andy\Desktop\zrsgsg\dsfsdf.cpp(33) : warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > *,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std
    ::basic_string<char,std::char_traits<char>,std::allocator<char> > &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > *,int>' : identifier was truncated to '255' characters in the debug information
    c:\programme\microsoft visual studio\vc98\include\vector(39) : warning C4786: 'std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::
    vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >' : identifier was truncated to '255' characters in the debug information
    c:\programme\microsoft visual studio\vc98\include\vector(60) : warning C4786: 'std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::
    ~vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >' : identifier was truncated to '255' characters in the debug information

    Die ich ehrlich gesagt nicht verstehe. Hat er Probleme damit das "daten" ursprüglich mit einem char-Array verwendet wurde?
    Ich benutze Visual C++ 6.0, muss ich da irgendwelche Einstellungen ändern?

    Viele Grüße
    Andreas



  • Wie sieht denn dein Code jetzt aus mit den Fehlern?



  • Welche Fehler meinst du, das eben waren Warnungen.
    Der Code sieht im Moment einfach so aus:

    #include <iostream>
    #include <string>
    #include <vector>
    
    int main()
    {
    
    	//char acText[256];
    	std::vector<std::string> daten;
    	//for(int i = 0; i < 10; i++) 
    //	{
    		//sprintf(acText, "Zahl: %i", i);
    	//	daten.push_back(std::string(acText));
    	//}
    
    /*	for(std::vector<std::string>::iterator dIter2(daten.begin()); dIter2 != daten.end(); ++dIter2)
    	{
    		printf("%s\n", dIter2);
    	}*/
    
    	return 0;
    }
    


  • Zu den Warnungen:
    Mit C4786 sagt Dir der Compiler, dass einige Type- Namen zu lang für den Debugger sind. Dies kann getrost ignoriert werden.

    Gibt es einen speziellen Grund, dass Du VC6.0 verwendest?

    Simon



  • Warum fragst du, ist der so schlecht?



  • Die Warnungen kannst du ignorieren (diese beziehen sich nur auf die langen template-Namen, welches für's Debugging auf 255 Zeichen gekürzt werden).

    Du kannst die Warnungen beim MSVC auch folgendermaßen ausschalten:

    #pragma warning (disable: 4786)
    

    P.S. Der VC6.0 ist schon einige Jahre alt (1998?), und unterstützt nicht alle C++ Standard Features (z.B. bei Templates und Namespaces).
    Du kannst dir eine aktuelle Express-Version des Visual Studios bei MS runterladen.



  • Und ersetze printf(...) dann mal durch *std::cout << dIter2 << endl;



  • thx, ich hats jetzt so realisiert:

    char acText[256];
    	std::vector<std::string> daten;
    	for(int i = 0; i < 10; i++) 
    	{
    		sprintf(acText, "Zahl: %i", i);
    		daten.push_back(std::string(acText));
    	}
    
    	for(std::vector<std::string>::iterator dIter2(daten.begin()); dIter2 != daten.end(); ++dIter2)
    	{
    		printf("%s\n", dIter2->c_str());
    	}
    

    Um meinem Char-Array wenigstens etwas treu zu bleiben^^ 😃



  • Andreas_LL schrieb:

    ...allein diese Deklaration erzeugt 4 Warnungen:...

    Das liegt am extrem veralteten VC++ 6.0. Die Warnung C4786 kann aber getrost deaktiviert werden (Der VC++ 6.0 hat Probleme mit Templates).

    Andreas_LL schrieb:

    Die ich ehrlich gesagt nicht verstehe.

    Die Warnungen sind auch wie gesagt nur auf ein Fehler im VC++ 6.0 zurückzuführen.

    Andreas_LL schrieb:

    Ich benutze Visual C++ 6.0, muss ich da irgendwelche Einstellungen ändern?

    les dir mal die "#pragma warning" - Direktive in der MSDN durch.

    Davon ganz abgesehen: Wenn du nicht wegen der Arbeit oder so gezwungen bist mit dem VC++ 6.0 zu arbeiten solltest du ihn dringens ersetzen. Sei es in dem du auf den kostenlosen VC++ 2008 Express oder irgendeinen anderen aktuellen Compiler umsteigst.

    VC++ 6.0 hat mehrere Probleme mit dem C++ Standard, wo das nur die Kleinste (wenn auch eine ziemlich nervige) Auswirkung ist. Ich weiß z.B. nicht wie du Zeiger nach allozierung mit new prüfst. In VC++ 6.0 wird unter den Standardeinstellungen 0 zurückgegeben, der Standard verlangt aber eine Exception (kann man aber umstellen, steht irgendwo unter new beschrieben).

    cu André



  • Andreas_LL schrieb:

    thx, ich hats jetzt so realisiert:
    ...
    Um meinem Char-Array wenigstens etwas treu zu bleiben^^ 😃

    Was willst du eigentlich Programmieren: C oder C++?

    printf & co sind nicht typsicher, Fehler werden in der Regel erst zur Laufzeit sichtbar...

    std::cin und std::cout sowie die Streamklassen insgesamt sind in der Regel die bessere Alternative.

    cu André


Log in to reply