char in unterprogramm



  • Hallo Liebe Freunde,

    Ich habe wieder einmal ein Problem, unzwar gehts um folgendes:

    Ich möchte ein Programm schreiben, welches eine Zeichenkette an ein Unterprogramm gibt. Im Unterprogramm soll geprüft werden, ob bestimmt Buchstaben in dem eingegebenem Wort enthalten sind.

    Ich habe erst einmal versucht, die Übergabe der Zeichenkette in folgender Form zu realisieren:
    (da die Aufgabenstellung noch über dies hinaus geht, ist in der Funktion auch noch ein int-Wert mit enthalten)

    #include<stdio.h>
    #include<stdlib.h>
    
    char word(char*, int*);
    
    main(){
    	char *a;
    	int *i;
    
    	word(&a, &i);
    }
    
    char add(char *a, int *i){
         *a = "F";
         *i = 5;
    }
    

    und bekomme folgende Fehlermeldungen:

    aufg3.c: In function ‘main’:
    aufg3.c:10: warning: passing argument 1 of ‘word’ from incompatible pointer type
    aufg3.c:4: note: expected ‘char *’ but argument is of type ‘char **’
    aufg3.c:10: warning: passing argument 2 of ‘word’ from incompatible pointer type
    aufg3.c:4: note: expected ‘int *’ but argument is of type ‘int **’
    aufg3.c: In function ‘add’:
    aufg3.c:14: warning: assignment makes integer from pointer without a cast
    /tmp/ccKgkMfS.o: In function main': aufg3.c:(.text+0x19): undefined reference toword'
    collect2: ld returned 1 exit status

    Ich habe so einiges versucht, war aber alles nutzlos. Wo liegt mein Fehler?

    Danke euch im voraus!!...

    Student.



  • aufg3.c:4: note: expected ‘char *’ but argument is of type ‘char **’

    -> word(&a, &i);

    wenn a vom Typ char* ist. Welchen Typ hat dann &a?



  • Die add-Methode sollte wahrscheinlich word heissen, oder?

    Das Programm, so wie es ist wird nicht funktionieren. Du hast 2 Pointer, die nirgendwohin zeigen. Es gibt also keinen Speicher, den man beschreiben kann.

    int main(){
        char a;
        int i;
    
        word(&a, &i); //'&a' ist die Adresse von 'a'
    }
    

    Das ist jetzt die Version für nur einen char. Für einen String nimmst du am besten erstmal ein Array. Da musst du aber aufpassen, innerhalb der Grenzen des Arrays zu bleiben, also am besten die Grösse auch an die Methode übergeben.

    #define MAX_SIZE 10
    
    int main(){
        char a[MAX_SIZE];
        int i;
    
        word(a, &i, MAX_SIZE); //hier ist 'a' schon die Adresse von 'a[0]'
    }
    


  • #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    int enthaeltBuchstaben(const char *s,size_t laenge)
    {
      while( laenge-- )
        if( isalpha(s[laenge]) ) return 1;
      return 0;
    }
    
    int main(){
        char *a = "0815 blafasel";
    
        if( enthaeltBuchstaben(a,strlen(a)) )
          puts("enthaelt");
        else
          puts("enthaelt nicht");
    
        return 0;
    }
    


  • Hallo Freunde,

    Danke für eure vielen Antworten, die mir echt sehr weiter geholfen haben!!

    Ich habe jetzt mal probiert das Problem in ein Programm umzusetzen. Beim Kompilieren tauchen keine Fehler mehr, nur tut das Programm nicht ganz was es tun soll 🙂

    Ich möchte im folgenden Programm eine Zeichenkette einlesen, an ein Unterprogramm geben welches prüfen soll, ob das Wort "UNIX" in der Zeichenkette vorhanden ist. Leider passiert aber nichts, auch wenn ich das Wort "UNIX" eingebe..

    #include<stdio.h>
    #include<stdlib.h>
    
    char word(char*, int*);
    
    main(){
    	char a;
    	int i = 0;
    
    	printf("Bitte geben Sie eine Zeichenkette ein:\n");
    	scanf("%c",&a);
    
    	word(&a, &i);
    
    }
    
    char word(char *a, int *i){
    	  int n;
    
    	  for(n = 0;n<20;n++){
    		if(a[n] == 'U'){
    		    if(a[n+1] == 'N'){
    			if(a[n+2] == 'I'){
    			    if(a[n+3] == 'X'){
    				printf("Perfekt!\n");
    			    }
    			}
    		    }
    		}
    	  }
    }
    


  • Bestehen deine Zeichenketten immer nur aus einem Buchstaben?



  • char a bietet Platz für ein Zeichen. UNIX hat aber schon 4 + die '\0' macht 5.

    main(){
        char a[200];  // Array für 200 Zeichen inkl. '\0'
        int i = 0;
    
        printf("Bitte geben Sie eine Zeichenkette ein:\n");
        scanf("%s",a); // a ist schon ein Zeiger siehe C-Grundlagen
    
        word(a, &i);   // a ist schon ein Zeiger siehe C-Grundlagen
    }
    

    Hatte aber D-U-D-E schon erklärt. 🙄

    Ein Frage noch zu word(): Woher weißt du das das 20 Zeichen sind?



  • Hey,

    ja danke, aber der Beitrag von DUDE mit dem MAX hat mich etwas verwirrt, deswegen frage ich.

    Aber trotzdem steht noch eine Sache offen:

    Das Programm läuft zwar in dieser Form:

    #include<stdio.h>
    #include<stdlib.h>
    
    char word(char*, int*);
    
    main(){
    	char a[20];
    	int i = 0;
    
    	printf("Bitte geben Sie eine Zeichenkette ein:\n");
    	scanf("%s",a);
    
    	word(&a[20], &i);
    
    }
    
    char word(char *a, int *i){
      int n;
    
      for(n = 0;n<20;n++){
         if(a[n] == 'U'){
    	    if(a[n+1] == 'N'){
    	           if(a[n+2] == 'I'){
    			  if(a[n+3] == 'X'){
    			    printf("Perfekt!\n");
    			  }
    		   }
    	    }
         }
      }
    }
    

    Jedoch bekomme ich keine Ausgabe. Wenn ich bei der Funktion die [20] hinschreibe, bekomme ich Fehlermeldungen:

    aufg3.c:18: error: conflicting types for ‘word’
    aufg3.c:5: note: previous declaration of ‘word’ was here
    aufg3.c: In function ‘word’:
    aufg3.c:22: warning: comparison between pointer and integer
    aufg3.c:23: warning: comparison between pointer and integer
    aufg3.c:24: warning: comparison between pointer and integer
    aufg3.c:25: warning: comparison between pointer and integer

    woher ich weiß dass es 20 Zeichen sind? Naja, habe ich einfach mal so festgestellt. Ich denke nicht dass jemand eine Zeichenkette mit 200 Zeichen eingibt 🙂



  • word(&a[20], &i);
    

    An dieser Stelle übergibst du die Adresse des 20ten Zeichens in deinem char-Array. Es sollte immernoch lieber

    word(a, &i, 20);
    

    heissen.
    Abgesehen davon solltest du beachten, dass du dich bei deinen if-Statements ab n= 17 ausserhalb des Arrays befindest und somit auf Speicher zugreifst, der dir gar nicht gehört. Den Fall würd ich auch abfangen.



  • Student123 schrieb:

    Ich denke nicht dass jemand eine Zeichenkette mit 200 Zeichen eingibt 🙂

    Unterschätze nie die Dummheit/Kreativität der Anwender.

    Das ist hier zwar nur Spielerei, aber trotzdem kannst du dir darüber Gedanken machen.

    Es gibt auch die Funktion strstr() aus der Standard Library. Die kann damit auch umgehen.

    Vor 20 Jahren war das knausern mit Speicher OK. Heute kommt es beim PC auf ein paar kByte nicht mehr an.



  • Hallo Freunde,

    danke euch für eure Hilfe. Ihr könnt euch gar nicht denken, welchen gefallen ihr mir getan habt!
    Ich habe das Programm zum laufen gebracht und es funktioniert auch so wie ich es möchte.

    Lediglich fehlt mir eine Sache, wobei ich wieder einmal eure Hilfe brauche:

    Im Programm wird ermittelt ob das Wort UNIX auftaucht. Wenn ich eine Zeichenkette ohne Leerzeichen eingebe, ermittelt er mir das zwar, aber wenn ich z.b. "Das Betriebssystem UNIX tritt heute meist in der Variante Linux auf" eingeben möchte, speichert er nur das vorangestellte "Das" ab.

    Wie kann ich das ändern?

    Liebe Grüße,

    Student!



  • Zeig mal bitte den Code.



  • Er liest mit scanf %s ein.

    This will read subsequent characters until a whitespace is found (whitespace characters are considered to be blank, newline and tab).



  • Hallo,

    mit %s speichert er nur das erste Wort(also bis zum Leerzeichen) ab.

    Der Code des ganzen Programms:

    #include<stdio.h>
    
    //Prototypdeklaration
    char word(char*, int*, int, int*);
    
    main(){
    	//Deklaration
    	int max = 256;
    	char a[max];
    	int Return = -1;
    	int Stelle = 0;
    
    	//Eingabe
    	printf("Bitte geben Sie eine Zeichenkette ein:\n");
    	scanf("%s",a);
    
    	//Funktionsaufruf
    	word(a, &Return, max, &Stelle);
    
    	//Ausgabe; falls das Wort "UNIX" in der Eingabe enthalten ist, dann Bedingung 1. Falls nicht,
    	//dann Bedingung 2.
    	if(Return == 1){
    		printf("Eingabestring:\n%s\n\n",a);
    		printf("Ausgabe:\n\"Die eingegebene Zeichenkette enthält das Wort \"UNIX\"\n\n");
    		printf("Das Wort tritt erstmals an %d. Stelle auf!\n",Stelle);
    	}
    	else if(Return == -1){
    		printf("Eingabestring:\n%s\n\n",a);
    		printf("Ausgabe:\nDie eingegebene Zeichenkette enthält das Wort \"UNIX\" nicht!\n\n");
    	}
    }
    
    char word(char *a, int *Return, int max, int *Stelle){
    	  //Deklaration
    	  int n;
    
    	  //Das Wort "UNIX" wird ermittelt
    	  for(n = 0;n<max;n++){
    		  if(a[n] == 'U'){
    			  if(a[n+1] == 'N'){
    				if(a[n+2] == 'I'){
    					if(a[n+3] == 'X'){
    					    *Return = 1;
    					    *Stelle = n+1;
    					}
    				}
    			  }
    		  }
    	  }
    }
    


  • Nimm statt scanf fgets, das liest die ganze Zeile.

    Für ein bisschen mehr C-Style:

    word ist eine Funktion, d.h. sie gibt einen Wert zurück. In deinem Fall ist es ein char.

    Warum nutzt du das nicht aus und gibst die ermittelte Stelle mit return zurück, oder -1 wenn der String nicht gefunden wurde.
    Als Rückgabetyp bietet sich int an.

    int word(char *a, int max){
          //Deklaration
          int n;
    
          //Das Wort "UNIX" wird ermittelt
          for(n = 0;n<max-3;n++){ /* -3, damit du nicht ausserhalb des Bereiches bist
              if(a[n] == 'U'){
                  if(a[n+1] == 'N'){
                    if(a[n+2] == 'I'){
                        if(a[n+3] == 'X'){                        
                            return = n; /* gefunden an Stelle n*/
                        }
                    }
                  }
              }
          }
          return -1; /* nicht gefunden */
    }
    

    Aufrufen tust du es dann so:

    Return = word(a, max);
    


  • DirkB meinte gets.

    printf ("Bitte geben Sie eine Zeichenkette ein:\n");
      gets (a);
    


  • Nein, ich meinte fgets.

    fgets(a, max-1, stdin);
    

    Da fgets eine Angabe für die maximale Länge hat.



  • Hey,

    die Idee mit dem return bzw. mit dem gets ist zwar in Ordnung, nur ist die Aufgabenstellung so wie ich den Code gestaltet habe. Laut Aufgabenstellung soll mit scanf und mit call-by-reference gearbeitet werden.

    a) Entwickeln Sie eine C-Funktion, die als Eingabeparameter eine Zeichenkette
    (char-Feld/array) erhält und die überprüft, ob in der Zeichenkette die Teilzeichenkette “UNIX” irgendwo vorkommt. Als Rückgabewert soll die Funktion -1 liefern, falls das Textmuster “UNIX” in der Zeichenkette nicht vorkommt, anderenfalls soll die Funktion die Position des ersten Buchstaben “U” des ersten Vorkommens von “UNIX” in der Zeichenkette zurückgeben. Geben Sie einen geeigneten Prototypen für die Funktion an und realisieren Sie die Funktion.
    

    bzw.

    b) Schreiben Sie ein main-Programm zum Testen der Funktion aus a). Im Haupt-
    programm ist zunächst eine Textzeile vom Standardinput einzulesen. Deklarieren Sie
    ein Character-Feld hinreichend großer Länge (z. B. 256) und verwenden Sie zum Ein-
    lesen einer Eingabezeile auf dieses Character-Feld die scanf-Formatierung
    scanf(“%[^\n]”, ...)
    


  • a) Da steht nichts von Call-by-Reference.
    Mein Vorschlag entspricht genau den Vorgaben.

    b) Warum nimmst du dann nicht wie vorgeschlagen scanf(“%[^\n]”, ...)
    Das “%[^\n]” liest die Leerzeichen mit ein.



  • achso^^
    Ich hatte mich schon gefragt wozu diese komischen zeichen da sind 😃


Anmelden zum Antworten