Verständniss Probleme bei Zeigerübergabe



  • Moin moin,

    ich bin derzeit dabei ein paar Kleinigkeiten mit C zu verstehen um sie jemanden zu vermitteln; ich hatte mal ein wenig mit gemacht C, aber habe das kaum weiter verfolgt, mochte das Zeigerprinzip nicht...

    Das Ziel des Code ist es ein Wort einzulesen,
    aus den geraden(0,2,4...) Buchstaben und dem ungeraden (1,3...) ein eigenes Wort zu machen
    und anschließend die beiden wieder zu einem Wort zusammen zufügen.

    //---------------------------------------------------------------------------
    #include<conio.h>
    #include<stdio.h>
    #pragma hdrstop
    
    //---------------------------------------------------------------------------
    char FunkGerade(char *);
    char FunkUngerade(char *);
    void Passwort(char*, char*);  //*1
    
    #pragma argsused
    int main(int argc, char* argv[])
    {
     char cInput;
     char *pC1;
     char cEingabe[40+1];
    
     printf("Bitte geben Sie ihr Passwort ein:  ");
     scanf("%s", cEingabe);
    
     pC1=cEingabe;
    
     printf("\n Alle Geraden Chars:  ");
     FunkGerade(pC1);
     pC1=cEingabe;
     printf("\n\n Alle Ungeraden Chars:  ");
     FunkUngerade(pC1);
     printf("\n\n Passwort Zusammensetzung:  ");
     Passwort(FunkGerade(pC1), FunkUngerade(pC1)); //*2
    
            getch();
            return 0;
    }
    //---------------------------------------------------------------------------
    char FunkGerade(char *pC1){
     char cGerade[20];
     int a;
    
     for(a=0;*pC1 != '\0';a++){
       cGerade[a]= *pC1;
       pC1=pC1+2;
    
     }
     cGerade[a]= '\0';
     printf("%s",cGerade);
     return *cGerade;
    
    }
    
    char FunkUngerade(char *pC1){
     char cUngerade[20];
     int a;
    
     pC1=pC1+1;
     for(a=0;*pC1 != '\0';a++){
       cUngerade[a]= *pC1;
       pC1=pC1+2;
    
       printf("%c", cUngerade[a]);
     }
      return *cUngerade;
    }
    
    void Passwort(char *FunkGerade,char *FunkUngerade){
      int a;
      int i;
      char zsm[40+1];
    
      for(a=0;*FunkGerade != '\0' || *FunkUngerade !='\0';a++){
        zsm[a]=FunkGerade[i];
        a++;
        zsm[a]=FunkUngerade[i];
        i++;
      }
    
      printf("%s", zsm);
    
      }
    

    *1, bin mir nicht mal sicher, ob die Funktion so deklariert wird
    *2, der Aufruf macht meiner Meinung nach Sinn, das Programm sieht das aber anders

    die beiden Funktionen,FunkGerade und Funkungerade, machen zwar fast das gleiche, ich wollte aber die Beiden Möglichkeiten zeigen.

    Kann mir bitte jemand helfen, was da alles an Denkfehlern drin hängt, das mit den Zeigern ist irgendwie nicht so ganz mein Ding.



  • Fehlermeldungen?



  • Das dürfte ja nicht mal übersetzt werden. Passwort() verlangt zweimal char*, du gibst ihm zweimal char...



  • da wird ja was tolles rauskommen wenn du diese "kleinigkeiten" dann noch jemand anders vermitteln willst 🤡



  • Fehlermeldungen:
    In function main': 29 C:\\Users\\sm\\Desktop\\c\\Unit1.c [Warning] passing arg 1 ofPasswort' makes pointer from integer without a cast
    29 C:\Users\sm\Desktop\c\Unit1.c [Warning] passing arg 2 of `Passwort' makes pointer from integer without a cast

    Und wenn man es trotzdem ausführt, gehts kaputt ;-), denke an der Stelle, die _matze beschrieben hat, daher habe ich die ja auch markiert.

    Zur Sache vermitteln:
    lieber versuche ich mein Bestes, mit ein wenig Grundkenntnissen jemandem weiterzugeben und zu helfen, der noch weniger Ahnung davon hat und für den es wichtig ist, als das ich ihn mit blöden Kommentaren im Regen stehen und untergehen lasse.



  • Erstens ist char und char* ein großer Unterschied, und zweitens kannst du C-Strings bzw. Pointer darauf nicht so einfach von einer Funktion zurückgeben lassen. Du zeigst dann auf Speicher, der lokal in der Funktion angelegt wurde und beim Beenden der Funktion nicht mehr gültig ist. Das kann nur schiefgehen. Mach lieber einen out-Parameter, also reserviere außerhalb der Funktion Speicher für ein char-Array und übergib einen Zeiger darauf...



  • Klar,das macht Sinn, das war die Sache mit den Zeigern 👍 und dem eigentlichen Sinn davon, werde ich in Ruhe mal ausprobieren, danke.



  • Ein kleiner Denkanstoß:

    void myFunc(char *outString,int len) {
    	strncpy(outString,"Hello World!",len);
    }
    int main() 
    {
    	char myString[256]={0};
    	myFunc(myString,256);
    	printf(myString);
    	getchar();
    }
    


  • Hey ho,

    der Fehlerteufel hat hier auch zugeschlagen:

    SMalar schrieb:

    ...
    char FunkGerade(char *pC1){
     char cGerade[20];
     int a;
    
     for(a=0;*pC1 != '\0';a++){
       cGerade[a]= *pC1;
       pC1=pC1+2;
    
     }
     cGerade[a]= '\0';
     printf("%s",cGerade);
     return *cGerade;
    
    }
    

    Angenommen du hast

    char szTest[2] = "a";
    FunkGerade(szTest);
    

    Was denkst du passiert hier?

    Undefiniertes Verhalten ⚠

    da du deinen Zeiger immer um 2 erhoest und nach dem szTest koennsten tausende Bytes von nicht Nullen stehen ;).
    Das gleiche natuerlich au bei der andern Funktion.

    Peace & Blessed Love C0de4Fun



  • Danke _matze, werde ich mal analysieren 😉

    Und danke Code4Fun, das hatte ich auch schon bemerkt, aber mit dem ersten Compiler, den ich nutzte, kam es da zu keinem Problem, und da der Code schon so vorgegeben war, dachte ich, dass eventuell sogar das gesamte Array danach mit "\0" aufgefüllt wird, erschien mir zwar unlogisch, aber lief.
    Und mein Compiler macht genau das was du sagst und wie ich es mir auch dachte, allein schon daher, da ja wirklich jedes Wort auf den Fehler stößt, da nur die eine ODER die andere Funktion, das "\0" finden kann ;-).

    Ich denke, dass ich mir das am Wochenende mal in Ruhe anschaue, ein wenig Grundkentnisse in C schaden ja nie 😃


Anmelden zum Antworten