char-String mit directive vergleichen

Gast #1808985
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
#1809009
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.
#1809281
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.
Gast #1809289
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren