stringlänge an int



  • int a=str.length(); // <- Warum funktioniert das nicht?

    arbeitest du mit std::string ? wenn nein dann solltest du das wenn du die methode length() verwenden willst!

    schau mal da:
    - http://cplus.kompf.de/artikel/strings.html

    - http://www.c-plusplus.net/forum/viewtopic.php?t=82071&highlight=length

    cu



  • Peggi schrieb:

    for(unsigned int x=0, y=0;x<strlen(s);x++)
    {
    if((isopt(s[x]))||(isdigit(s[x]))||(s[x]=='.')) str[y++]=s[x];
    if(s[x]==',') str[y++]='.';
    }
    int a=str.length(); // [b]<- Warum funktioniert das nicht?[/b]
    

    Sorry...bin Anfängerin (deshalb bitte ich um eine verständliche Erklärung)

    Danke 😉

    Warum geizen eigentlich so viele Hilfesuchende mit Infos? Ihr wollt doch, dass wir euch helfen. Du könntest ja wenigstens die Fehlermeldung und den Typ von str mit angeben...
    Falls das sein std::string ist, sollte es gehen.



  • Also, ich erhalte beim Kompilieren mit dem Borlandcompiler folgenden Fehler:

    Error E2294 parser.cpp 38: Structure required on left side of . or .* in function Parser::copystring(char 😉

    Zeile 38 ist die von mir markierte.

    str ist ein Pointer auf einen Char.

    Ja, ich ich habe alle benötigten includes, auch string.h .

    Ich hoffe, ich konnte euch damit helfen, damit ihr mir helfen könnt. 🙂

    (sorry wegen der ersten meldung)



  • der typ sollte std::String sein, nicht char* für char* sollte es die funktion length() tun(denk ich, habs aber noch nie genutzt^^)



  • Nein, strlen() aus <cstring>.



  • var1:

    #include <iostream>
    #include <string.h> 
    #include <string> 
    
    using namespace std; 
    
    int main() 
    { 
        const char *str1 = "Teststring";
    
        string str2 (str1);
        cout << "Der String ist " << gelernt.lenght() << " Zeichen lang."<< endl;
    
        return 0;
    }
    

    var2:

    #include <iostream>
    #include <string.h>
    #include <sstream> 
    #include <string> 
    
    using namespace std; 
    
    int main() 
    { 
        const char *str1 = "Teststring";
    
        stringstream str2;
        str2 << str1;
        cout << "Der String ist " << gelernt.str().lenght() << " Zeichen lang."<< endl;
    
        return 0;
    }
    

    probier mal...bin mir net net sicher ob das klappt... 🕶



  • ändere in:

    length();
    


  • Hi!

    Wenn str ein String ist und man length aufruft wird size_t zurückgeliefert, genau wie bei strlen. cout wird dies bei der Ausgabe nach unsigned int casten, allerdings ist size_t größer als unsgined int (in C++ ist size_t ein eigener Typ und kein typedef; in C war es ein typedef für unsigned int).
    Es sollte also statt int auch size_t verwendet werden:

    size_t len = strlen(str); // str ist char*
    size_t len = str.length(); // str ist std::string
    

    Code-Hacker



  • Danke erstmal für eure bisherige Arbeit.

    size_t len = strlen(str);

    funktioniert zwar, wirft dafür später neue fehler auf...hm...ich bin glaub ich blöd.

    ich poste euch mal den ganzen quelltext...(ps: der ist aus einem buch und trotzdem fehlerhaft - 😃 )

    #include <iostream.h>
    
    #include <string.h>
    #include <ctype.h>
    #include <stdlib.h>
    #include "tstack.h"
    #include "parser.h"
    
    Parser::Parser(char *s)
    {
    	str=0;
    	copystring(s);
    	parse();
    }
    
    void Parser::Parse(char *s)
    {
    	copystring(s);
    	parse();
    }
    
    Parser::Parser(void)
    {
    	str=0;
    	len=0;
    }
    
    void Parser::copystring(char *s)
    {
    	if(str) delete[](str);
    	str=new(char[strlen(s)]);
    	for(unsigned int x=0,y=0;x<strlen(s);x++)
    		{
    			if((isopt(s[x]))||(isdigit(s[x]))||(s[x]=='.')) str[y++]=s[x];
    			if(s[x]==',') str[y++]='.';
    		}
    	str[y]=0; //[b] Hier das Original - sieht n Blinder, dass das nicht geht![/b]
    	len=y;
    	cout << "\nVerwendete Formel:\"" << str << "\"\n";
    }
    
    double Parser::Result(void)
    {
    	return(result);
    }
    
    inline int Parser::isopt(char c)
    {
    	return(((c=='+')||(c=='-')||(c=='*')||(c=='/')||(c=='(')||(c==')')));
    }
    
    double Parser::getopd(long &p)
    {
    	double wert=atof(&(str[p]));
    	if(isopt(str[p])) p++;
    	while(!isopt(str[p])) p++;
    	return(wert);
    }
    
    void Parser::parse(void)
    {
    TStack<char> opt(len);
    TStack<double> opd(len);
    
    long strpos=0;
    double wert;
    char op;
    
    	if((str[strpos]=='+')||(str[strpos]=='-'))
    		opd.Push(getopd(strpos));
    
    	while(strpos<len)
    		{
    			switch(str[strpos])
    				{
    				case'+':
    				case'-':
    					opt.Push(str[strpos++]);
    					break;
    
    				case'(':
    					while(str[strpos]=='(') opt.Push(str[strpos++]);
    					opd.Push(getopd(strpos));
    					break;
    
    				case'*':
    				case'/':
    					if(str[strpos+1]=='(')
    						opt.Push(str[strpos++]);
    					else
    						{
    							wert=opd.Pop();
    							if(str[strpos++]=='*')
    								opd.Push(wert*getopd(strpos));
    							else
    								opd.Push(wert/getopd(strpos));
    						}
    					break;
    
    				case')':
    					strpos++;
    					op=opt.Pop();
    					wert=opd.Pop();
    					while(op!='(')
    						{
    							if(op=='+')	wert=opd.Pop()+wert;
    							if(op=='-')	wert=opd.Pop()-wert;
    							op=opt.Pop();
    						}
    					if(opt.Size())
    						{
    							op=opt.Pop();
    							if((op=='/')||(op=='*'))
    								{
    									if(op=='*')	wert=opd.Pop()*wert;
    									if(op=='/')	wert=opd.Pop()/wert;
    								}
    							else
    								opt.Push(op);
    						}
    					opd.Push(wert);
    					break;
    
    				default:
    					opd.Push(getopd(strpos));
    					break;
    				}
    		}
    	wert=opd.Pop();
    	while(opt.Size()!=0)
    		{
    			op=opt.Pop();
    			if(op=='+')	wert=opd.Pop()+wert;
    			if(op=='-')	wert=opd.Pop()-wert;
    		}
    	result=wert;
    }
    

    und die header-datei:

    class Parser
    {
    	private:
    		char *str;
    		int len;
    		double result;
    		void parse(void);
    		int isopt(char);
    		double getopd(long&);
    		void copystring(char*);
    
    	public:
    		Parser(char*);
    		Parser(void);
    		double Result(void);
    		void Parse(char*);
    };
    

    ich hab gedacht, ich könnte das prob einfach umschiffen, indem ich die stringlänge neu ermittle, wie oben beschrieben...war wohl nix...

    wenn ich das ganze mit der abwanlung size_t len = strlen(str);
    compiliere, dann wirft er mir gleich diesen ganzen batzen fehler aus:

    Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
    Error: Unresolved external 'TStack<char>::~TStack<char>()' referenced from C:\PROGRAMME\BORLAND\BCC55\BIN\MAINPA
    R.OBJ
    Error: Unresolved external 'TStack<double>::~TStack<double>()' referenced from C:\PROGRAMME\BORLAND\BCC55\BIN\MA
    ARSER.OBJ
    Error: Unresolved external 'TStack<char>::TStack<char>(unsigned long)' referenced from C:\PROGRAMME\BORLAND\BCC5
    IN\MAINPARSER.OBJ
    Error: Unresolved external 'TStack<double>::TStack<double>(unsigned long)' referenced from C:\PROGRAMME\BORLAND\
    55\BIN\MAINPARSER.OBJ
    Error: Unresolved external 'TStack<char>::Push(char)' referenced from C:\PROGRAMME\BORLAND\BCC55\BIN\MAINPARSER.
    
    Error: Unresolved external 'TStack<double>::Push(double)' referenced from C:\PROGRAMME\BORLAND\BCC55\BIN\MAINPAR
    .OBJ
    Error: Unresolved external 'TStack<char>::Pop()' referenced from C:\PROGRAMME\BORLAND\BCC55\BIN\MAINPARSER.OBJ
    Error: Unresolved external 'TStack<double>::Pop()' referenced from C:\PROGRAMME\BORLAND\BCC55\BIN\MAINPARSER.OBJ
    Error: Unresolved external 'TStack<char>::Size()' referenced from C:\PROGRAMME\BORLAND\BCC55\BIN\MAINPARSER.OBJ
    

    ich hoffe, ihr helft mir noch n stück weiter, ich peils einfach nicht - und ich hab schon alles über strings und so durchgelsen, was ich finden konnte.

    wenn noch was fehlt, poste ich das selbstverständlich!

    liebe grüße



  • Bitte bitte bitte bitte steinigt mich nich! *ankoppfass*

    habs selbst gesehen...*peinlichrotanlauf*

    danke nochmal für eure hilfe! (besonders Code-Hacker)

    Gruß

    Peggi 🙄


Anmelden zum Antworten