Forum: Compiler & IDEs char-String mit directive vergleichen


von Brocken Sei (Gast)


Lesenswert?

Ich habe hier folgendes Coding:
1
#include <stdio.h>      //Standard input output
2
#include <stdlib.h>
3
#include <stdint.h>     //Standard Integer
4
#include <inttypes.h>   //verschiedene Datentypen von Int 16, 32, 64...
5
#include <complex.h>    //komplexes rechnen
6
#include <stdbool.h>    //Datentyp Bool eingebunden
7
#include <float.h> //Limitwerte für Gleitpunktzahlen
8
#include <limits.h>//Limitwerte für char int long ...
9
#include <iso646.h>
10
#include <string.h>
11
12
#define Vergl "dao"
13
14
void Function(char Ein[])
15
{
16
    if(Ein == Vergl)
17
        printf("Gleich");
18
    else printf("Ungleich");
19
}
20
21
int main(void)
22
{
23
    Function("dao");
24
    return EXIT_SUCCESS;
25
}

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

von Klaus W. (mfgkw)


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!

von Hc Z. (mizch)


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.

von Brocken Sei (Gast)


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

von Klaus W. (mfgkw)


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.

von Karl H. (kbuchegg)


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.

von Brocken Sei (Gast)


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:
1
#define Vergl "esa"
2
3
void Function(char Ein[])
4
{
5
    if(strcmp(Ein, Vergl) == 0)
6
        printf("Gleich");
7
    else printf("Ungleich");
8
}
9
10
int main(void)
11
{
12
    Function("esa");
13
    return EXIT_SUCCESS;
14
}

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

Gruß Bro

von Karl H. (kbuchegg)


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.

von Brocken Sei (Gast)


Lesenswert?

Passt thxx Leute

Gruß Bro

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.