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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.