ein stück eines char zurückgeben



  • ich habe mir eine mini funktion geschrieben die einen teil eines char array zurückgeben soll.

    char *GetString(char buffer[128], int position, int count)
    {
    	char *Output = new char[count];
    	for(int x = 0; x < count; x++)
    	{
    		Output[x] = buffer[position];
    		position++;
    	}
    	return Output;
    }
    

    in einer funktion habe ich also z.B.

    char buffer[128];
    

    davon möchte ich nun z.B. die zeichen von sagen wir index 3 - 60.
    dies sollte eben meine funktion wie oben beschrieben erledigen. geht irgendwie nur telweise. gibt es einen anderen weg? oder was mache ich falsch?



  • Du vergisst, die Null ans Ende anzuhängen!



  • wo denn?
    ach ja, wie kann ich den speicher wieder freigeben? Output ist ja lokal und code nach dem return würde ja nicht erreicht werden. wie kann ich also Output löschen?



  • std::string



  • hi,
    probiers mal damit.

    #include <iostream>
    #include <string>
    using namespace std;
    
    string GetString(const string&buffer, int position, int count) 
    {
    	string sRes="";
    	for(int i=position-1;i<position+count-1;++i)
    		sRes+=buffer.at(i);
    	return sRes;
    }
    
    int main()
    {
    	string s="1234567890";
    
    	cout << GetString(s,3,4);
    
    	return 0;
    }
    

    ich hoffe, das das der richtige lösungsansatz ist

    mfg _mika_



  • bei deinem code stürzt mir das program ab. 😮



  • dafür gibts doch substr von std::string



  • meine variable ist aber ein char array und kein std::string.



  • kannst du das nicht ändern?



  • doch was ich auch habe. string tmp = buffer; buffer ist vom typ char und wird mit 128 indiziert.

    wenn ich aber nun

    blah1 = tmp.substr(7, 11);
    blah2 = tmp.substr(13, 3);
    blah3 = tmp.substr(20, 30);
    blah4 = tmp.substr(23, 6);

    mache, dann krieg ich beim letzten ein out of range 😕 😕 was aber nicht sein kann, ausser bei "string tmp = buffer;" stimmt was nicht.



  • weise ich denn string tmp das komplette char array so zu?

    string tmp = buffer;

    wenn buffer[128] ist?



  • int main(int argc, char *argv[])
    {
    char foo[128] = "abcdHALLOefg";
    char buf[128] = "";
    memcpy(buf,foo+4,5);
    printf("%s\n",buf);
    system("PAUSE");
    return 0;
    }

    Einfachs C Beispiel. Kannst du dir ja anpassen.



  • hm das kalppt aber nicht mit std::string. ich möchte ja ein komplettes char array (buffer[128]) einem std::string übergeben. mit memcpy komm ich da nicht weit. mit strcpy auch nicht. 😞 😞





  • Ohne es selbst durch kompiliert zu haben , schlage ich folgende Lösung vor:

    char *GetString(char buffer[128], int position, int count)
    {
        char *Output = new char[count];
        for(int x = 0; x < count; x++, position ++) // increment position
        {
            Output[x] = buffer[position];
            position++;
        }
        Output[position] = '\0';
        return Output;
    }
    

    Dein Fehler war es (meiner Meinung nach), das du immer das gleiche Elment in deinen output schreibst und diesen dann nicht mit NULL abtrennst.

    Wie gesagt alles ohne garantie ....

    cia tobi



  • ich incrementiere ja position bereits im schleifen block. 🙄 😕

    ich glaube das von masterofx32 geht 😋 mal genauer unter die lupe nehmen.



  • *am kopf kratz* ich werde glech verrückt mit dem buffer 😃
    schaut euch folgendes an:

    char buffer[128];
    	FILE *datei = fopen(FileName.c_str(), "rb");
    	if(datei)
    	{
    		fseek(datei, -128, SEEK_END);
    		if(fread(buffer, 1, 128, datei) == 128)
    		{
    			MessageBox(NULL,buffer,"",48);
    		}
    	}
    	fclose(datei);
    

    ich deklariere also ein char array mit 128.
    mit fread schreibe ich also 128 bytes in den buffer.
    die messagebox soll mir für debugzwecke dann den ganzen buffer anzeigen aber ich erhalte da nur 7 zeichen obwohl es 128 zeichen sein müssen. 🙄 😮 😕 😕

    erkennt jemand den fehler?



  • opps ... tja wer lesen kann ist klar im vorteil. also jetzt noch mal mit sachverstand. Flogender Code gibt dir den entsprechenden string zurück:

    char *GetString(char buffer[128], int position, int count)
    {
        char *Output = new char[count];
        int x;
        for(x = 0; x < count; x++) // increment position
        {
            Output[x] = buffer[position];
            position++;
        }
        Output[x] = '\0';
        return Output;
    }
    
    int main(int argc, char* argv[])
    {
        char b[128];
    
        strcpy(b, "HALLO WELT. SCH... Wetter heute");
    
        printf("%s", GetString(b, 3, 8));
    }
    

    gibt mir zurück

    LO WELT

    ist damit dein problem gelöst?



  • kann es sein das deine MessageBox das Problem ist? Bei mir funktioniert das ganz eigentlich ziemlich gut. Ich habe nur der Form halber das Array mit einem StopBit abgeschlossen. Das sollte aber nicht das Problem sein.
    Kann es ein das dein File Zeilenumbrüche beinhaltet, welche die MessageBox nicht mag? 😕



  • danek für deine mühe, aber vergessen wir nun mal die GetString funktion. dies hat sich bereits erledigt da ich es ja anderst löse. das char buffer[128] was auch bei der funktion GetString vorkommt hat nichts miteinander zu tun. ich weis das ganze verwirrt ein bisschen. aber lassen wir nun einfach die GetString funktion weg.

    was dein letztes posting angeht:

    Kann es ein das dein File Zeilenumbrüche beinhaltet

    hm, eigentlich sollte das alles auf einer zeile beruhen. es handelt sich um einen mp3 tag. dieser ist oder sollte imho in einer zeile stehen. insofern sollte es bei fread und dems chreiben in das buffer array ja keine konflikte geben. ebenfalls insofern sollte dann ja auch die ausgabe der messagebox erfolgreich sein, was aber nicht der fall ist. hmmmmmmmm



  • ich poste am besten mal meinen ganzen code.
    dann könnt ihr mir (da ich noch anfänger bin) auch gleich sagen ob ich sonst alles richtig deklariert habe. weil z.B. wollte ich eigentlich das GenreList array im konstruktor initialisieren etc.

    also, ich habe mir eine kleine klasse geschrieben die den header bzw. den mp3 tag auslesen soll.

    header

    //---------------------------------------------------------------------------
    #include <vcl.h>  //borland, für String (AnsiString)
    #include <string>
    //---------------------------------------------------------------------------
    using namespace std;
    //---------------------------------------------------------------------------
    class CMP3Header
    {
    	public:
    		CMP3Header();
    		~CMP3Header();
    		String Artist;
    		String Title;
    		String Album;
    		String Genre;
    		void LoadMP3File(String FileName);
    
    	private:
    		bool isVersion1;
    		bool isVersion2;
    		//char *GenreList[126];
    };
    //---------------------------------------------------------------------------
    

    quellcode .cpp

    //---------------------------------------------------------------------------
    #include "mp3header.h"
    //---------------------------------------------------------------------------
    char *GenreList[] = {"Blues","Classic Rock","Country","Dance","Disco","Funk","Grunge",
    							 "Hip-Hop","Jazz","Metal","New Age","Oldies","Other","Pop","R&B",
    							 "Rap","Reggae","Rock","Techno","Industrial","Alternative","Ska",
    							 "Death Metal","Pranks","Soundtrack","Euro-Techno","Ambient","Trip-Hop",
    							 "Vocal","Jazz-Funk","Fusion","Trace","Classical","Istrumental","Acid",
    							 "House","Game","Sound Clip","Gospel","Noise","AlternRock","Bass","Soul",
    							 "Punk","Space","Mediatative","Instrumental Pop","Instrumental Rock","Ethnic",
    							 "Gothic","Darkwave","Techno-Industrial","Electronic","Pop-Folk","Eurodance",
    							 "Dream","Southern Rock","Comedy","Cult","Gangsta","Top 40","Christian Rap",
    							 "Pop-Funk","Jungle","Native American","Cabaret","New Wave","Psychadelic","Rave",
    							 "Showtunes","Trailer","Lo-Fi","Tribal","Acid Punk","Acid Jazz","Polka","Retro",
    							 "Musical","Rock & Roll","Hard Rock","Folk","Folk-Rock","National Folk",
    							 "Swing","Fast Fusion","Bebob","Latin","Revival","Celtic","Bluegrass","Avantgarde",
    							 "Gothic Rock","Progressive Rock","Psychedelic Rock","Symphonic Rock","Slow Rock",
    							 "Big Band","Chorus","Easy Listening","Acoustic","Humour","Speech","Chanson",
    							 "Opera","Chamber Music","Sonata","Symphony","Booty Brass","Primus","Porn Groove",
    							 "Satire","Slow Jam","Club","Tango","Samba","Folklore","Ballad","Poweer Ballad","Rhytmic Soul",
    							 "Freestile","Duet","Punk Rock","Drum Solo","A Capela","Euro-House","Dance Hall"};
    
    CMP3Header::CMP3Header()
    {
    
    }
    //---------------------------------------------------------------------------
    CMP3Header::~CMP3Header()
    {
    
    }
    //---------------------------------------------------------------------------
    void CMP3Header::LoadMP3File(String FileName)
    {
    	Artist = "";
    	Title = "";
    	Album = "";
    	Genre = "";
    	char buffer[128];
    	FILE *MP3File = fopen(FileName.c_str(), "rb");
    	if(MP3File)
    	{
    		fseek(MP3File, -128, SEEK_END);
    		if(fread(buffer, 1, 128, MP3File) == 128)
    		{
    			String t_Artist(&buffer[33],30);
    			String t_Title(&buffer[3],30);
    			String t_Album(&buffer[63],30);
    			if(buffer[0] == 'T' && buffer[1] == 'A' && buffer[2] == 'G')
    			{
    				Artist = t_Artist;
    				Title =	t_Title;
    				Album =	t_Album;
    				Genre = GenreList[buffer[127]];
    			}
    		}
    	}
    	fclose(MP3File);
    }
    //---------------------------------------------------------------------------
    

Anmelden zum Antworten