Probleme mit Pointern bzw. Zeichenketten



  • Hi bin relativ neu hier und komme einfach nicht mit der Übergabe von Arrays und dessen Vergleiche in "C" klar.
    Hier mal mein Code:

    #include <stdio.h> 
    #include <stdlib.h>
    #include <string.h>
    
    void sing(const char* v, const char* c);
    
    int main(void) {
    	const char v[] = "Drei Chinesen mit dem Kontrabass \nsaßen auf der Straße und erzählten sich was. \nDa kam die Polizei, fragt ‚Was ist denn das?‘ \nDrei Chinesen mit dem Kontrabass.";
    	char c[] = "aa";
    
    	printf("SING MY SONG! \n\n");
    	printf("%s\n\n", v);
    	printf("Geben sie Vokal, Umlaut oder Doppellaut ein: ");
    	scanf("%c", &c);
    	printf("\n");
    
    	sing(v, c);
    }
    
    void sing(const char* v, const char* c)
    {
    	int len = strlen(v);
    	for (int i = 0; i < len; i++)
    	{
    		if (strcmp(&v[i], "e") == 0)
    		{
    			if (strcmp(&v[i + 1], "i") == 0)
    			{
    				&v[i] == c;
    			}
    			else
    			{
    				&v[i] == c;
    			}
    		}
    		else if (strcmp(&v[i], "a" || "i" || "o" || "u" || "ä") == 0)
    		{
    			if (strcmp(&v[i + 1], "h") != 0)
    			{
    				&v[i] == c;
    			}
    		}
    	}
    }
    

    Folgende Fehler bzw. Warnungen treten auf:

    Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
    Fehler C2220 Warnung wird als Fehler interpretiert, es wurde keine object-Datei generiert.
    Warnung C4553 "==": Operator hat keine Auswirkungen; ist "=" beabsichtigt?
    Warnung C4553 "==": Operator hat keine Auswirkungen; ist "=" beabsichtigt?
    Warnung C4047 "Funktion": Anzahl der Dereferenzierungen bei "const char *" und "int" unterschiedlich
    Warnung C4024 "strcmp": unterschiedliche Typen für formalen und übergebenen Parameter 2
    Warnung C4553 "==": Operator hat keine Auswirkungen; ist "=" beabsichtigt?

    Da ich wie gesagt noch überhaupt nicht mit C und dessen Arrays klar komme wollte ich hier mal nachfragen, wie ich diese an bestimmten Stellen setze und überhaupt richtig übergebe. Vielleicht hat ja jemand eine bildliche Veranschaulichung zu Arrays und dessen Pointer rumliegen?

    Danke im voraus!

    Edit: Aufgabe ist es, Vokale Umlaute und z.B. "ei" abzuändern in den vorher eingegeben Buchstaben aber auch Doppellaut im "char c[]". Außerdem darf nach dem zu veränderten Laut kein "h" folgen daher auch die Abfrage falls sich jemand fragt was ich da überhaupt fabriziert habe 😃



  • Kevkaa schrieb:

    Warnung C4553 "==": Operator hat keine Auswirkungen; ist "=" beabsichtigt?
    Da ich wie gesagt noch überhaupt nicht mit C und dessen Arrays klar komme...

    Lesen kannst du aber?! Deine Probleme haben nichts mit Arrays zu tun. Was ist der Unterschied zwischen "=" und "==" ?



  • Ein Pointer enhält eine Adresse.
    Bei einer Zeichenkette (String) eird die Adresse vom 1. Zeichen angegeben.

    Der String geht immer bis zum Terminator (Das Zeichen '\0' mit dem Wert 0)

    Bei if (strcmp(&v[i], "e") == 0) vergleichst du den Reststring von v ab Position i mit einem "e".
    Dies kann, wenn überhaupt, nur beim letzten Zeichen erfolgreich sein.

    Wenn du ein einzelnes Zeichen vergleichen Willst, dann mach das doch:

    if (v[i] == 'e')
    

    Bei &v[i] == c; vergleichst du (wg. ==) die Adresse vom i. Element in v mit der Adresse von c.
    Da v und c verschiedene Arrays sind, ist der Vergleich immer unwahr.
    Das Ergebnis diese Vergleichs wird nicht verwendet, somit hat diese Zeile keinen Effekt. Sie kann weggelassen werden.

    Und diese || Kaskade funktioniert so in C nicht.

    Ein const string darf nicht verändert werden

    Es gibt sonst auch noch andere Zeichensuchfunktionen in string.h

    Welche Programmiersprache kennst du schon, dass du auf solchen Code kommst?



  • Kevkaa schrieb:

    ...
    		else if (strcmp(&v[i], "a" || "i" || "o" || "u" || "ä") == 0)
    

    lol



  • Da sind diverse Dinge drin.

    1. strcmp. Dies vergleicht 2 Zeichenketten, nicht zwei Zeichen. strcmp(&v[i], "e") vergleicht also den String v (ab dem i-ten Zeichen bis zum Ende!) mit dem String "e". Das ist nicht, was du willst. Das Zeichen 'e' wird in C von der einbuchstabigen Zeichenkette "e" unterschieden: Für einzelne Zeichen werden einfache Anführungszeichen verwendet, für Zeichenketten doppelte. Das bedeutet, dass du statt strcmp einfach v[i] == 'e' schreiben solltest, um das i-te Zeichen mit 'e' zu vergleichen.

    2. Dann schreibst du Code wie &v[i] == c; . Was soll das machen? Hier vergleichst du 2 Dinge (linke und rechte Seite des ==) und verwirfst das Ergebnis. Aber nicht nur das, du vergleichst 2 Adressen (siehe dein &). Was willst du hier eigentlichen machen?!

    1. strcmp(&v[i], "a" || "i" || "o" || "u" || "ä") == 0)
      Das geht so nicht. Du kannst nicht einfach wild || hinschreiben und hoffen, dass das beste herauskommt. Du musst schon einzeln vergleichen. Aber siehe auch 1.


  • Ich ignoriere einfach mal die runterziehenden Beiträge von manch einem Mitglied hier, ihr wurdet bestimmt Allwissend geboren ja ne is klar 🙂

    Danke schonmal das hat mir sehr weiter geholfen!
    &v[i] == c bei dieser Zeile wollte ich das i-te Zeichen durch die Zeichenkette c ersetzen, wie kann ich dies abändern? Das ich v nicht verändern darf da es ein const char ist weiß ich ja jetzt, wenn ich v vorher in ein anderes char abspeichere und dieses dann dementsprechend an der i-ten Stelle durch c ersetzen möchte wie würde das funktionieren?



  • Du kannst in C keine ganzen Arrays durch eine Zuweisung (=) kopieren. C-Strings sind char-Arrays.
    Einzelne Zeichen kannst du aber zuweisen.

    Also wenn c nur ein Zeichen hat, dann kommst du mittels c[0] oder *c an dieses Zeichen dran.



  • Du bist mit der grundlegenden Syntax von C nicht vertraut, wie deine Versuche zeigen.
    Wenn du die Grundlagen nicht erlernen willst sondern sinnfrei irgendwas hinschreibst, was der Compiler nicht sofort zurückweist und dann hier anfragst, was wohl falsch ist, zeigt das deinen Lernunwillen.
    Geh woanders spielen.



  • Kevkaa schrieb:

    Ich ignoriere einfach mal die runterziehenden Beiträge von manch einem Mitglied hier, ihr wurdet bestimmt Allwissend geboren ja ne is klar

    also ein vernünftiges buch (keins von jürgen wolf) könntest du dir schon zulegen. normalerweise sind da am ende jedes kapitels übungsaufgaben drin, die das gelernte festigen sollen.

    es ist deutlich zu erkennen, dass du einfach mal drauflos probiert hast. ⚠


Anmelden zum Antworten