Ausgabe von selbstgemachen Funktionen mit printf

Neue Frage »

Auf diesen Beitrag antworten »
Lycaner Ausgabe von selbstgemachen Funktionen mit printf

Ich habe folgendes Programm geschrieben, die zwei Zeichenketten vergleicht.

#include <stdio.h>

int main (void) {

char text[100];
char Matrikelnummer[]="666666";

scanf("%s", text);
xy(&text,&Matrikelnummer);

printf (" %s und %s ",xy(&text,&Matrikelnummer) );

return 0;
}

int xy(const char*s1,const char*s2){
int i;
for(i=0; s1[i]!='\0'&& s2[i]!='\0'; i=i+1)
if(s1[i]!=s2[i])return (0);
return(s1[i]=='\0'&& s2[i]=='\0');
}


Und jetzt wollte ich schauen ob, es funktioniert aber ich weiß nicht was ich bei der printf –Funktion schreiben soll, damit das Ergebnis der Funktion ausgegeben wird.
 
Auf diesen Beitrag antworten »
Karlito

Hallo,

printf funktioniert so, dass du zuerst einen String mit dem Text übergibst, welcher ausgegeben werden soll. Das ist bei dir " %s und %s ". Dabei werden Platzhalter vergeben. Jedem Platzhalter wird dann einer der folgenden Parameter von printf zugeordnet. Dabei muss die Reihenfolge der Platzhalter und der Parameter gleich sein.

"%s" gibt einen C-String aus. D.h. Die Parameter müssen auch vom Typ char[] sein. Du übergibst jedoch nur einen Parameter. xy(&text,&Matrikelnummer) wird ausschließlich zu dem Rückgabewert. printf hat keinerlei Zugriff auf die beiden Parameter &text und &Matrikelnummer.

Richtiger wäre:
code:
1:
2:
3:
printf (" %s und %s: %d ", text, Matrikelnummer, xy(text, Matrikelnummer) );


Du bemerkst sicher, dass ich die & entfernt habe. text und Matrikelnummer sind bereits vom Typ char *. Hängst du ein "&" davon, so erhältst du ein char **.

Tipp: Kompiliere immer mit -Wall mit dem gcc bzw /Wall mit dem Windows-Compiler. Die Warnings erzählen dir nach etwas Übung vieles von dem was ich dir grad erzählt habe. Während man bei Java die Warnings oft ignorieren kann, wirst du dein blaues Wunder erleben, wenn du das bei C tust smile

Solltest du noch Fragen haben, kannst Du sie gern hier posten. Über die Lösung freuen sich zukünftige Leser sicher auch.

VG,

Karlito
Auf diesen Beitrag antworten »
Lycaner

Danke, hat mir sehr geholfen, leider sind bei mir jetzt weiter Fragen aufgetaucht.

Int kann nur eine Zahl zurück geben aber in der Funktion( return(s1[i]=='\0'&& s2[i]=='\0'); ) steht ein Bedingung( ich habe die Funktion nicht selber geschrieben, die war vorgegeben, ich sollte nur das passende Program schreiben) Wieso funktioniert es trotzdem?

Ich habe es gelöscht und einfach (return 1; )eingegeben und es hat genauso funktioniert.

Wenn z.B. statt int xy(const char*s1,const char*s2) void xy(const char*s1,const char*s2) stehen würde, was musste man bei dem return eingeben? Return 1 ist ja falsch, weil void keine Zahl zurückgibt.
Auf diesen Beitrag antworten »
Karlito

Hallo,

das funktioniert trotzdem, da es in C keinen eigenen Typ für wahrheitswerte gibt. In C ist es so, dass 0 false entspricht und alles Andere entspricht true. Das ergebnis einer Bedingung, wie du sie da hast, ist immer 1 oder 0. Somit erhältst du , wenn (s1[i]=='\0'&& s2[i]=='\0') wahr wird, dann ist eben der Rückgabewert 1, ansonsten 0.

Änderst du den Rückgabetyp einer Funktion auf void, so wird nichts zurückgegeben. Demnach gibt man hinter return einfach nichts zurück. Bsp:

code:
1:
2:
3:
4:
5:
6:
7:
8:
void doSomeThing(int par1, char *par2){
 /*
  A lot of sensible sourcecode 
 */
 //return; //Muss nicht angegeben werden
}


return wird bei void-Funktionnen nur benötigt, wenn du die Funktion vorzeitig verlassen willst. Bsp:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
void doSomeThing(int par1, char *par2){

 //Some errorchecking-Code

 if(error){
  printf("Something bad happened :(\n");
  return;
 }

 /*
  A lot of sensible sourcecode after checking
 */

 //return; //Muss nicht angegeben werden

}


Damit würdest Du, wenn ein Fehler aufgetreten ist, vorzeitig aus der Funktion herausspringen und den daruterstehenden Code der Funktion nicht abarbeiten.

Alles Klar?

VG,

Karlito
 
Auf diesen Beitrag antworten »
eulerscheZahl

kleine Ergänzung:
Zitat:
Original von Lycaner
Ich habe es gelöscht und einfach (return 1; )eingegeben und es hat genauso funktioniert.


Weil du es nicht ausreichend getestet hast:
ist der Anfang des eingegebenen Textes gleich der Martikelnummer, so liefert deine Funktion eine 1:
gibt man z.B. 6666667 ein, so wird behauptet, es sei identisch mit 666666.

Wie du die Funktion ursprünglich vorgegeben hattest, wird zudem noch geprüft, ob die strings gleich lang sind.
Auf diesen Beitrag antworten »
Lycaner

Vielen Dank
Auf diesen Beitrag antworten »
Lycaner

Oh man, und ich dacht ich habe es verstanden aber bei dem nächsten Beispiel hänge ich schon wieder. Die Funktion ist gegeben und ich soll das Programm schreiben. Aber es komm nur 100 Fehlermeldungen(



#include <stdio.h>

int main (void) {

int a=2;
int b=5;
char c='+';

calc(a,b,c);
printf( "%i %c %i =",a,c,b,calc(a,c,b));

return 0;
}



int calc(unsigned int e1, unsigned int e2, char op){
switch (op){
case '-':return(e1-e2);
case '*':return(e1*e2);
case '/':return(e1/e2);
default:
case '+': return(e1+e2);
}
}
Auf diesen Beitrag antworten »
Karlito

Hallo,

1. Du musst in C Funktionen bekannt machen, bevor du sie verwendest. D.h. entweder du Kopierst die gesamte Funktion vor die main oder du gibst den so genannten Prototypen vor der main an.

Der Prototyp ist der Funktionskopf ohne die eigentliche implementierung. Für dein Beispiel wäre das:

code:
1:
2:
3:
int calc(unsigned int ,unsigned int , char ); //Semikolon beachten! Parameternamen sind optional.


Weiterhin hast du den Platzhalter für das Ergebnis vergessen. Du musst diesen angeben! Es wird nicht einfach das letzte Argument an die Zeichenkette angehangen.

VG,

Karlito
Auf diesen Beitrag antworten »
Karlito

Vielleicht noch ein Beispiel:

code:
1:
2:
3:
4:
5:
6:
printf("%d\n", 5); //gibt 5 aus
printf("%d\n", 5, 6); //gibt 5 aus
printf("%d %d\n", 5, 6); //gibt "5 6" aus
printf("%d\n"); //gibt einen zufälligen Wert aus


VG,

Karlito
Auf diesen Beitrag antworten »
Lycaner

Danke
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »