2 strings vergleichen mit referenz



  • Hi Leute, bin neu hier..

    unszwar möchte ich nur ein kleines programm schreiben, dass 2 eingegebene Strings vergleicht und in der funktion vergleiche ein ergebnis ausgibt

    hier ist der code

    void eingabe (char* z1[], char* z2[])
    {
        cout<<"Zeichenkette 1 = ";
        cin>>*z1;
        cout<<"Zeichenkette 2 = ";
        cin>>*z2;
    }
    
    void vergleiche (char* z1[], char* z2[])
    {
        if(strcmp(*z1,*z2)==0)  cout<<"Die Zeichenketten sind identisch!";
        else                  cout<<"Die Zeichenketten sind nicht identisch!";
    }
    
    int main()
    {
        char z1[10], z2[10];
        eingabe(&z1[],&z2[])
        vergleiche(&z1[],&z2[]);
        getch();
        return 0;
    }
    

    und hier der fehlercode

    Fehler E2188 main.cpp 21: Ausdruckssyntax in Funktion main()
    Warnung W8080 main.cpp 25: 'z2' ist deklariert, wird aber nie verwendet. in Funktion main()
    Warnung W8080 main.cpp 25: 'z1' ist deklariert, wird aber nie verwendet. in Funktion main()
    

    hoffe jemand kann mir weiterhelfen



  • Das geht so nicht so einfach. Da müsstest du die C-Funktionen nutzen, um strings zu vergleichen.
    http://www.cplusplus.com/reference/clibrary/cstring/strcmp.html

    Allerdings würde ich zu std::string raten, da man da das ganze auch ganz einfach per = - Operator vergliechen kann.

    #include <string>
    ..
    std::string s1 = "hallo";
    std::string s2 = "hallo";
    
    if ( s1 == s2 )
     std::cout << "gleich" << "\n";
    else
     std::cout << "ungleich" << "\n";
    


  • Hey,

    du solltest unbedingt std::string nutzen, wenn du schon in C++ programmierst:

    #include <iostream>
    #include <string>
    
    void eingabe(std::string& s1, std::string& s2)
    {
    	std::cout << "Zeichenkette 1 = ";
    	std::cin >> s1;
    
    	std::cout << "Zeichenkette 2 = ";
    	std::cin >> s2;
    }
    
    void vergleiche(const std::string& s1, const std::string& s2)
    {
    	if (s1 == s2)
    	{
    		std::cout << "Die Zeichenketten sind identisch!" << std::endl;
    	}
    	else
    	{
    		std::cout << "Die Zeichenketten sind nicht identisch!" << std::endl;
    	}
    }
    
    int main()
    {
    	std::string str1, str2;
    	eingabe(str1, str2);
    	vergleiche(str1, str2);
    }
    


  • ok vielen dank das hat nun geklappt,
    bin grad am üben etc..wollte nicht nochn Thread erstellen,

    nun möchte ich mit zeigertechnik das eingegebene Wort in Kleinbuchstaben umwandeln
    Es wird nur der erste Buchstabe umgewandelt, allerdings werden danach irgendwelche Zeichen ausgeben.

    wenn ich mit referenzen arbeite klappt das
    hier ist der code

    void eingabe (char* z)
    {
        cout<<"Zeichenkette = ";
        cin>>*z;
        while(*z!=0)
        {
            if(*z>='A' && *z<='Z') *z+=32;
            cout<<*z;
            z++;
        }
    
    }
    
    int main()
    {
        char z;
        eingabe(&z);
    
        return 0;
    }
    


  • benutz dafuer doch bspw. std::transform.

    #include <string>
    #include <algorithm>
    #include <cctype>
    using std::string;
    using std::transform;
    
    #define tolower ( int(*)(int) ) std::tolower
    #define toupper ( int(*)(int) ) std::toupper
    
    string strToLower( const string &p_str )
    {
      string result( p_str );
      transform( result.begin(), result.end(), result.begin(), tolower );
      return result;
    }
    
    string strToUpper( const string &p_str )
    {
      string result( p_str );
      transform( result.begin(), result.end(), result.begin(), toupper );
      return result;
    }
    

    hoffe das klappt so, ist ungetestet ...
    sonst google nach den funktionen, cplusplus.com/reference koennte auch helfen.

    "( int()(int) ) std::tolower"
    muss sein, weil tolower als funktion in <cctype> und <locale> (iirc) jeweils anders deklariert ist, und man direkt sagen muss, welche der funktionen man haben will.
    damit man nicht immer "( int(
    )(int) )" davor schreiben muss, kann man z.b. diese defines nutzen.
    dasselbe gilt fuer toupper ...

    mfg,
    julian



  • Corax schrieb:

    char z; 
        eingabe(&z);
    

    Was du hier tust, führt zu undefiniertem Verhalten, da z nicht initialisiert ist. Da du den char* als Zeichenkette behandeln willst, solltest du auch eine solche übergeben - also ein statisches oder dynamisches Array von char , und nicht einen Zeiger auf einen einzelnen char . Innerhalb der Funktion erwartest du schliesslich eine Nullterminierung.



  • Lies lieber in einen string ein und kannst du Iteratoren benutzen. Fände ich persönlich ein wenig schöner. Zeiger sind hier nicht angebracht.
    Vor allem kannst du C-strings, wie du siehst nicht so intuitiv nutzen.

    Wenn du dich dennoch mit diesen rumschlagen willst, dann solltest du dich zuerst ein wenig näher damit befassen:
    http://www.cplusplus.com/reference/clibrary/cstring/
    + google


Anmelden zum Antworten