www.mikrocontroller.net

Forum: Compiler & IDEs char-String mit directive vergleichen


Autor: Brocken Sei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe hier folgendes Coding:
#include <stdio.h>      //Standard input output
#include <stdlib.h>
#include <stdint.h>     //Standard Integer
#include <inttypes.h>   //verschiedene Datentypen von Int 16, 32, 64...
#include <complex.h>    //komplexes rechnen
#include <stdbool.h>    //Datentyp Bool eingebunden
#include <float.h> //Limitwerte für Gleitpunktzahlen
#include <limits.h>//Limitwerte für char int long ...
#include <iso646.h>
#include <string.h>

#define Vergl "dao"

void Function(char Ein[])
{
    if(Ein == Vergl)
        printf("Gleich");
    else printf("Ungleich");
}

int main(void)
{
    Function("dao");
    return EXIT_SUCCESS;
}


Ich habe hier das Wort "dao" mit einem Array auf Gleichheit verglichen 
und es funktioniert.
Jetzt meine Frage wo ich nirgends drauf die Antwort habe finden können 
ist: Wieso kann ich dann 2 Arrays nur vergleichen indem ich jedes 
einzelne Zeichen vergleiche--> for ??

Gruß Bro

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit Ein == Vergl vergleichst du nicht die Strings.
Vielmehr werden die beiden Zeiger auf den jeweiligen Anfang der Strings 
verglichen.


Um Strings zu vergleichen, kann man selbst eine Schleife bauen oder 
gleich strcmp() verwenden.

-> C-Grundlagen!

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast kein Wort mit einem anderen verglichen, sondern die Adresse 
eines Strings mit derselben Adresse desselben Strings.

Da zweimal "dao" auftritt, hat der Compiler in seiner unendlichen 
Weisheit beschlossen, dass dafür beidesmal derselbe String ausreicht. 
Das ist nicht garantiert (dass er das entdeckt und diese Optimierung 
vornimmt).

Ein Randeffekt, nicht mehr.

Autor: Brocken Sei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> -> C-Grundlagen!

Ich lese gerade C von A bis Z und bin gerade bei Arrays, Zeiger kommen 
erst. Aber zwischendurch probiere ich natürlich so manches aus und 
deshalb auch die Frage.

Gruß Bro

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
War ja auch nicht böse gemeint; nur als Erklärung, warum es keinen
Sinn macht das hier breit zu erklären - wenn es eh in jedem Buch steht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Frage an sich ist ja gut

Der Unterschied ist in etwa so, wie wenn du 'Familien' vergleichen 
würdest. In dem einen Fall (strcmp) vergleichst du alle 
Familienmitglieder miteinander. Im anderen Fall (==) vergleichst du, ob 
sie im selben Haus wohnen (dieselbe Adresse haben).

Du bist jetzt nur darüber gestolpert, dass der Compiler beschlossen hat, 
dass er die beiden Familien "dao" (da sie augenscheinlich identisch 
sind) im selben Haus unterbringen kann. Das kann er tun, muss er aber 
nicht.

Autor: Brocken Sei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Der Unterschied ist in etwa so, wie wenn du 'Familien' vergleichen
> würdest. In dem einen Fall (strcmp) vergleichst du alle
> Familienmitglieder miteinander. Im anderen Fall (==) vergleichst du, ob
> sie im selben Haus wohnen (dieselbe Adresse haben).

Hmm, nach ein bisschen Überlegung habe ich glaube ich geschnallt worum 
es in dem Bsp geht.

Also ist dann das hier kein Zufall mehr:
#define Vergl "esa"

void Function(char Ein[])
{
    if(strcmp(Ein, Vergl) == 0)
        printf("Gleich");
    else printf("Ungleich");
}

int main(void)
{
    Function("esa");
    return EXIT_SUCCESS;
}



denn das funktioniert und vergleicht die die einzelnen Zeichen wie Klaus 
Wachter schon gesagt hat.

Gruß Bro

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Brocken Sei schrieb:

> Also ist dann das hier kein Zufall mehr:

Genau.
Das vergleicht die beiden Strings, indem Zeichen mit Zeichen verglichen 
wird. Wo diese beiden Strings konkret im Speicher liegen spielt keine 
Rolle mehr.

Autor: Brocken Sei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Passt thxx Leute

Gruß Bro

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.