Hilfe bei Programm



  • Halli Hallo,

    ich studiere Computer Engineering im 1. Semester und muss in einem Studienfach Programme schreiben. Meine Aufgabe heißt:

    3. Realisieren Sie ein C-Programm, das eine Zeichenkette einliest,
    aber nur die ersten 5 zulässigen Zeichen erfasst. Zulässig sollen nur
    die alphabetischen Zeichen sowie die Sonderzeichen '.' ',' '-' sein.
    Alle anderen Zeichen sollen ignoriert, d. h. nicht angezeigt werden.

    Ich sitze nun seit 2 Tagen dran, und bin irgendwie aufm Holzweg glaube ich. Hier einmal mein Code

    #include<stdio.h>
    
    int main()
    {
    	char eingabe[100];
    	int ueberpruefung = 0;
    	int a;
    
    	printf("Bitte geben Sie 5 Zeichen ein: \n");
    	scanf("%s\n", &eingabe[0]);
    
    		if (ueberpruefung != 4)
    		{
    			for (a = 0; eingabe[a] != '\0'; a++)
    				{
    				if ((eingabe[a] >=44  && eingabe[a] <=46), (eingabe[a]>=65 && eingabe[a]<=90), (eingabe[a]>=97 & eingabe[a]<=122))	
    					{
    					printf("%c\n",eingabe[a]);
    					}	
    					else
    					{
    					a++;
    					}
    				}
    			ueberpruefung ++;
    		}
    	return 0;
    }
    

    Also ich glaube zu wissen wie ich es lösen muss, nur fehlt mir das nötige Know-How dazu.

    Ich möchte das so schreiben, dass Zeichen für Zeichen überprüft wird, ob eben die gewünschten Zeichen vorhanden sind. Das überprüfen wollte ich anhand der ASCII Dezimalzahlen prüfen. Dazu zu 2 if -Anweisung. Die 1. ist jetzt wo ich das so lese Bullshit, sie sollte dazu dienen eben nur 5 der gewünschten Zeichen auszugeben.

    Jetzt weiß ich nicht mehr weiter.

    Ich bitte um Hilfe. 😞 😞

    Grüße moses



  • moses030 schrieb:

    3. Realisieren Sie ein C-Programm, das eine Zeichenkette einliest, aber nur die ersten 5 zulässigen Zeichen erfasst. Zulässig sollen nur die alphabetischen Zeichen sowie die Sonderzeichen '.' ',' '-' sein. Alle anderen Zeichen sollen ignoriert, d. h. nicht angezeigt werden.

    Dein Ansatz sieht doch schon ganz gut aus. ein wenig dran gefeilt, und Du hast es.

    Es mag Dir jetzt wie Mehrarbeit erscheinen, aber ich würde Dir vorschlagen, die Überprüfung auszulagern.
    Statt der "nackten" ASCII-Werte kannst Du übrigens auch gegen die Zeichen testen, z.B.:

    #include <stdbool.h>
    
    // testet ob c der GROSSBUCHSTABE A, B oder C ist.
    bool isABC(char c) {
      return c>='A' && c<='C';
    }
    

    Kannst Du nach dem Muster eine Funktion schreiben, die Kriterien der Aufgabe überprüft?

    Weiterhin kannst Du mit der Funktion int getchar(); aus der Standardbibliothek einzelne Zeichen aus stdin lesen. Schließlich brauchst Du den kompletten übergebenen String nicht zu speichern, oder?



  • Erstmal danke für die schnelle Antwort, werde mich gleich ran machen das umzuschreiben.

    Mit der Funktion getchar() kenn ich mich leider noch nicht aus. Muss ich mich reinlesen.

    Aber Danke nochmals für deine Antwort 🙂



  • #include <stdio.h>
    
    int zeichenZulaessig(char c)
    {
       if(c >= 'a' && c <= 'z')
          return 1;
    
       if(c >= 'A' && c <= 'Z')
          return 1;
    
       if(c == '.' || c == ',' || c == '-')
          return 1;
    
       return 0;
    }
    
    int main()
    {
       char eingabe[101];
       int anzahl = 0;
       int i = 0;
    
       printf("Geben Sie eine Zeichenkette ein:\n");
    
       scanf("%100s", eingabe);
       printf("\n\n");
    
       while(eingabe[i] && anzahl < 5)
       {
          if(zeichenZulaessig(eingabe[i]))
          {
             printf("%c", eingabe[i]);
             ++anzahl;
          }
          ++i;
       }
    
       printf("\n\n");
    }
    


  • Danke Belli für den Code,

    wenn ich ein Leerzeichen schreibe, brincht er leider ab und nimmt nur das was davor steht. Kann man das noch mit einbeziehen das er das leerzeichen ignoriert?

    Grüß und danke nochmals



  • - erstelle eine Positivliste der erlaubten Zeichen
    - nutze Stringfunktionen

    #include <stdio.h>
    #include <string.h>
    
    enum { N = 5 };
    
    int main()
    {
    	const char *erlaubt = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-";
    	char eingabe[100], *x = eingabe;
    	char ergebnis[N + 1] = { 0 }, *y = ergebnis;
    	int a = 0;
    
    	fgets(eingabe, 100, stdin); /* String inkl. Leerzeichen lesen */
    
    	while (a < N && *x != '\0') /* bis Stringende zeichenweise auswerten, aber bis max. 5x */
    	{
    		if (strchr(erlaubt, *x)) /* ist das aktuelle Zeichen erlaubt? */
    		{
    			a++;       /* Trefferzähler erhöhen */
    			*y++ = *x; /* erlaubtes Zeichen in ergebnis anfügen */
    		}
    		++x;
    	}
    
    	puts(ergebnis);
    	return 0;
    }
    


  • Hey WUtz, auch dir danke für den Code.

    Der ist leider echt schwer für mich zu verstehen 😕

    Für euch ist das wahrscheinlich alles pipifax 😃

    ich bemühe mich ihn zu "entschlüsseln". Ich kann ihn nachvollziehen aber selber anwenden könnte ich ihn wohl nicht 😕

    danke euch trotzdem nochmals 🙂



  • moses030 schrieb:

    wenn ich ein Leerzeichen schreibe, brincht er leider ab und nimmt nur das was davor steht. Kann man das noch mit einbeziehen das er das leerzeichen ignoriert?

    Benutze fgets statt scanf, so wie Wutz in seinem Code.



  • moses030 schrieb:

    wenn ich ein Leerzeichen schreibe, brincht er leider ab

    Das ist halt bei scanf mit %s so.

    Das Leerzeichen ist ein sog. Whitespace und da wird bei %s abgebrochen.

    Nachzulesen z.B. bei http://www.cplusplus.com/reference/cstdio/scanf/



  • Könnte man den auch ohne Zeiger in Witz seinem Code arbeiten?

    Zeiger sind ja wieder etwas womit ich mich beschäftigen muss. Nur wenn ich alles jetzt mache bin ich wohl überfordert 😃



  • moses030 schrieb:

    Könnte man den auch ohne Zeiger in Witz seinem Code arbeiten?

    Ja, kann man.

    moses030 schrieb:

    Zeiger sind ja wieder etwas womit ich mich beschäftigen muss.

    Ja, musst du unbedingt

    int main()
    {
        char erlaubt[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-";
        char eingabe[100];
        char ergebnis[N + 1] = { 0 };
        int a = 0;
        int ix = 0; iy = 0;
    
        fgets(eingabe, 100, stdin); /* String inkl. Leerzeichen lesen */
    
        while (a < N && eingabe[ix] != '\0') /* bis Stringende zeichenweise auswerten, aber bis max. 5x */
        {
            if (strchr(erlaubt, eingabe[ix])) /* ist das aktuelle Zeichen erlaubt? */
            {
                a++;       /* Trefferzähler erhöhen */
                ergebnis[iy++] = eingabe[ix]; /* erlaubtes Zeichen in ergebnis anfügen */
            }
            ++x;
        }
    
        puts(ergebnis);
        return 0;
    }
    

Log in to reply