char in unterprogramm
-
#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 integerwoher 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
-
Hallo,
ich habe ein weiteres Problem, wobei ich eure Hilfe brauche.
Ich soll ein Programm schreiben, welches ein Passwort einliest und checkt, ob es mindestens 12 Zeichen, einen Groß- bzw. Kleinbuchstaben und ein nicht-alphanumerisches Zeichen enthält.Nun steht dabei, dass ich mit islower, isupper, isdigit und isalnum arbeiten soll. Das sind Funktionen in der Headerdatei ctype.h.
Kann mir jemand bei der Syntax dieser Funktion behilflich sein? Im Internet stoße ich nur auf Visual Basic und .Net Programmcodes.
Liebe Grüße,
Student
-
http://lmgtfy.com/?q=islower%2Cc
http://lmgtfy.com/?q=isupper%2Cc
http://lmgtfy.com/?q=isdigit%2Cc
http://lmgtfy.com/?q=isalnum%2CcEtwas Mühe muss man sich auch selber geben.
-
http://www.cplusplus.com/reference/clibrary/
Die Seite ist Pflichtbookmark für alle C- und C++-Programmierer.Beachte das im Headerverzeichnis der Seite die C++-Header angegeben sind (d.h. mit c vorne und ohne .h hinten), die Beispiele sind dann aber in C.