yannick-server
Goto Top

Char Array - char Vergleich

Hallo zusammen,
ich habe leider ein Problem beim erstellen von Char-Arrays in C, und dem Vergleich von Chars.

char zeichen[10];
    zeichen[1] = a;
    zeichen[2] = b;
    zeichen[3] = c;
    zeichen[4] = d;
    zeichen[5] = e;
    zeichen[6] = f;
    zeichen[7] = g;
    zeichen[8] = h;
    zeichen[9] = i;
    zeichen[10] = j;
    zeichen....

    char name;
    name = "abc";  

    //vergleichen
    if(name == zeichen[1]+zeichen[2]+zeichen[3])
         {
         printf("Ready!");  
        }

Es gibt einfach keine Übereinstimmung.
Es ist bestimmt sehr einfach, aber ich habe schon halb google durch ohne Erfolg face-sad

Da ich noch nicht lange mit C programmiere, wäre ich euch dankbar,
wenn ihr mir ein paar gute Seiten mit Tutorials für C-nennen könntet.

Schonmal vielen Dank
Yannick

Content-ID: 153531

Url: https://administrator.de/contentid/153531

Ausgedruckt am: 06.11.2024 um 01:11 Uhr

elric78
elric78 21.10.2010 um 14:43:29 Uhr
Goto Top
Als erstes solltest du die einzelnen Char's so: 'a' in den Array einfügen.
Zweitens fängt ein Array eigendlich mit zeichen an und geht dann bis zeichen[9].
Vielleicht geht es jetzt, kanns hier leider nicht testen.

Deine Abfrage kommt mir komisch vor. Ich habe sowas früher mit nem Pointer gelernt. Aber aus dem Stand kann ich das nicht mehr
76109
76109 21.10.2010 um 16:46:25 Uhr
Goto Top
Hallo Yannick!

anstatt Array
char zeichen = { 'A', 'B', 'C', ...};
einfacher so
char zeichen = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
wobei, wie schon erwähnt , bei Offset 0 begonnen wird.

Gruß Dieter
dog
dog 21.10.2010 um 21:09:10 Uhr
Goto Top
In C gibt es keine Strings.
Das ist eine ganz wichtige Regeln.
Ein String in C ist ein Array aus einzelnen Zeichen, dessen letzter Index ein NUL ist.
Ein Zeichen selbst ist eine Zahl, die erst über eine Zeichentabelle bei der Ausgabe in einen Buchstaben aufgelöst wird.

Die Variable eines Strings in C ist der Pointer auf den Speicherort des ersten Buchstabens.

Entsprechend hast du hier folgendes versucht:

char name = "abc";  

#< name ist jetzt bspw. 0x1

if(name == zeichen[1]+zeichen[2]+zeichen[3])

#entspricht
if(0x1 == (97+98+99))

#entspricht
if(1 == 294)

#entspricht
if(0)

und ein if(0) ist per Definition false.

Wenn du zwei Strings in C vergleichen willst, dann über die strcmp-Funktion.
Dazu müssen es aber Null-terminierte Strings und keine Char-Arrays sein.

Einfach und C sind übrigens 2 Sachen, die sich eigentlich ausschließen face-wink
yannick-server
yannick-server 22.10.2010 um 08:37:48 Uhr
Goto Top
Danke für eure Antworten.
Das einfach und C zwei verschiedene Sachen sind hab ich bemerkt,
ich werde trotzdem nicht aufhöhren ;)
Ich habe jetzt mal den gesamten Code mit Fehlermeldung eingefügt.
Ich bekomme es leider einfach nicht zum laufen face-sad
#include <stdio.h>
#include <conio.h>
#include <string.h>

int main(void)
{   
    int a, b;
    
    char zeichen_a, zeichen_b;
    char  zeichen = "abcdefg";  
   
    char name;
    name = "de";//[Warning] assignment makes integer from pointer without a cast     
    char zeichen_kette;
    
    for (a=0; a<6; a++){
        zeichen_a = zeichen[a];
        for (b=0; b<6; b++){
            zeichen_b = zeichen[b];
            zeichen_kette = strcat(zeichen_a,zeichen_b);//[Warning] passing arg 1 of `strcat' makes pointer from integer without a cast  
            printf("%c\n", zeichen_kette);         
            if(strcmp(name, zeichen_kette) == 0)//[Warning] passing arg 1 of `strcmp' makes pointer from integer without a cast  
                {
                printf("Ready!");  
                printf("%c\n", zeichen_kette);  
                getch();
                return(0);
                } 
        }
   
    }
    getch();	
    return 0;
}
76109
76109 22.10.2010 um 16:08:30 Uhr
Goto Top
Hallo Yannick!

Also, mit:
char name;
wird nur Speicherplatz für ein Zeichen bereitgestellt. Von daher solltest Du für "name" die gleiche Methode, wie in Codezeile 10 (char name = "abc..") anwenden.

Und für:
char zeichenkette
wird auch nur Speicherplatz für ein Zeichen bereitgestellt.
Da "zeichenkette" aber hier als Buffer verwendet wird, kannst Du hier Speicherplatz so reservieren
char zeichenkette[20];
Das reicht für 19 Zeichen und ein EndOfString (NullTerminiert)).
Und immer darauf achten, das der Buffer groß genug ist, um alle Zeichen aufzunehmen. Ansonsten würde dies unliebsame Nebeneffekte auslösen z.B. andere Variablen oder eine Rücksprungadresse (Return) zu einer Prozedur überschreiben usw.

Hoffe, ich hab's halbwegs verständlich formuliert? face-smile

Gruß Dieter
yannick-server
yannick-server 23.10.2010 um 12:34:17 Uhr
Goto Top
Zitat von @76109:
Hoffe, ich hab's halbwegs verständlich formuliert? face-smile

Hallo Dieter!
Danke sehr gut erklärt, habs verstanden.