Bereiche
News
Rewind
Tipps & Berichte
Forum
Galerie
Journals
Events
Umfragen
Themenwoche
Kleinanzeigen
Interaktiv
Anmelden
Registrierung
Zu allen empfangenen Nachrichten
Suche...
Zur erweiterten Suche
Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum
>
Software
>
C - Funktion (C programmieren)
C - Funktion (C programmieren)
snowman-x
13.02.10
21:15
hallo leute!
ich hab ein kleines problem und zwar werde ich bald eine info klausur schreiben!!!
und da werden wir funktionen schreiben müssen!
kann mir einer sagen (oder auch schreiben) wie ich eine funktion schreibe die ein beliebiges wort aus dem terminal einließst und RÜCKWERTS wieder ausgeben kann???
mein problem ist das rückwerts ausgeben
ich hoffe ihr könnt mir helfen...bis morgen
ich bedanke mich schonmal total doll im vorraus!!!!
Hilfreich?
0
Kommentare
dreyfus
13.02.10
21:34
Na so ungefähr...
char* rueckwaerts(char *s)
{
int i, j;
char *t;
strcpy(t,s);
for(i = 0 , j = strlen(s) - 1 ; j >= 0 ; i++, j--)
*(s + i) = *(t + j);
return s;
}
Hilfreich?
0
snowman-x
13.02.10
21:55
cool ich danke dir für die schnelle antwort ich werds mal testen!!
Hilfreich?
0
snowman-x
13.02.10
22:18
ich hab da nochmal ne frag...bin ja noch anfänger... das feld t also char *t wo steht wie groß das ist oder woher weiss ich das? damits nicht zu überschreibungen kommt
wenn ich jetzt ein wort im terminal eingeben und es der funktion übergeben möchte kann ich das dann in der main mit scanf speichern? weil ich weiss zwar wie ich einer funktion ein wort übergebe das vorher in der main mit länge und so deklariert ist aber ich weiss nicht wie ich das mache wenn ich das aus dem terminal einlese also irgendein beliebiges wort eben! deswegen hab ich auch noch kleine probleme mit der main....
danke für die hilfe!!!
Hilfreich?
0
dnbblah
13.02.10
22:33
also eine funktion kann man folgendermaßen aufbauen beispiel ist für java aber anhand von C# kannst du das abstrahieren.
public = öffentliche methode von ausserhalb der klasse zugänglich
String = der ausgabeparameter sprich umgewandelter string
und (String eingabe) = eingabeparameter der normale String
public String rueckwärts(String eingabestring)
{
//eingelesener String umkeheren mittels for schleife
String newstring;
itn x=0;
for (int i=eingabestring.lengh();i=0;i--)
{
newstring[x] = eingabestring[i];
x++;
}
return newstring
}
Hilfreich?
0
M@cBenutzer
13.02.10
22:42
Hier, das Ganze als Programm. Du übergibst den/die zu invertierenden String(s) und fertig.
#include <stdio.h>
#include<string.h>
int main(int argc, char *argv[])
{
int i,j;
for(i=1; i<argc; i++)
{
j=strlen(argv[i]);
while(j>=0)
{
putchar(argv[i][j]);
j--;
}
printf("\n");
}
return 0;
}
Hilfreich?
0
re:com
13.02.10
22:43
also wenn java, dann wenigstens richtig bitte
edit: aar ... jetzt hab ich den Blödsinn ja auch noch kopiert ... arg
Hilfreich?
0
M@cBenutzer
13.02.10
22:46
@dnbblah
das Klassenname.Methode kannste knicken, das ist C, was er fragt. ANSI-C, wenn ich das genau verstanden habe.
@snowman-x
Was du suchst heisst string.h.
Darin ist die Funktion strlen() definiert. Kannst auch gern Google befragen. "C von A bis Z" ist da mein persönlicher Favorit. Müsste es, wenn ich nicht irre auch kostenlos online zu lesen geben.
Hilfreich?
0
schleiftier
13.02.10
22:50
Mit Eingabe...
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
char wort[100];
int length = 99;
int i;
scanf("%99s", wort);
length = strlen(wort);
while (length >= 0){
putchar(wort[length--]);
}
putchar('\n');
return 0;
}
Hilfreich?
0
M@cBenutzer
13.02.10
22:52
@schleiftier
Da hatte einer dieselbe Eingabe...
mal 'ne blöde Frage, warum nimmst du nicht argc und *argv[]? Und warum referenzierst du zweimal auf argv[]?
Hilfreich?
0
re:com
13.02.10
22:54
dnbblah
Nochmal:
Wenn du schon mit ein Java-Beispiel kommst (womit ein C-ler wahrscheinlich äußerst wenig anfangen kann) dann wenigstens bitte richtig! Dein Code ist ja nur voller Fehler ...
Hilfreich?
0
schleiftier
13.02.10
22:55
Tja, da war ich wohl zu langsam
Meine Version fragt das Wort halt selber ab und bekommt es nicht als Argument übergeben. *char[] und char** bedeuten das gleiche: *char[] ist ein Array von Zeigern auf char* - und ein Array ist in C immer auch nur ein Zeiger.
Hilfreich?
0
M@cBenutzer
13.02.10
23:03
Okay, alles klar. So hatte ich das bisher noch nicht gesehen. Wieder was gelernt.
"Arrayname = Zeiger auf Adresse mit beginn des Arrays" ist soweit klar. Gibt doch immer andere Schreibweisen. hihi
Bist du dann eigentlich so "hardcore" drauf und schreibst z.B. IF-Abfragen nur mit "?"-Operator ?
Hilfreich?
0
snowman-x
13.02.10
23:30
SUPER!!!!!!! vielen dank für die ganzen antworten!! hätte ich ja nicht gedacht^^klasse forum!!!
dann werd ich mir das nochmal in ruhe durch den kopf gehen lassen und dann wirds doch hoffentlich werden
danke auch für den tipp c von a bis z!
DANKE
Hilfreich?
0
TiBooX
13.02.10
23:49
schleiftier
array ist
nicht
das selbe wie pointer
----- 8<-----
char*a;
char b[20];
printf( "%d != %d",sizeof(a),sizeof(b) );
----- >8-----
Überraschung !
„People who are really serious about software should make their own hardware [A. Kay]“
Hilfreich?
0
schleiftier
13.02.10
23:49
Ne, ich mag lesbaren Code. char** geht halt schneller zu tippen...
Hilfreich?
0
TiBooX
14.02.10
00:01
schleiftier
2 Sterne Programmieren, wie ?
Etwas genauer:
----- 8<-----
printf( "%d\n", (int)sizeof(char*) ); // 4 oer 8 je nach compiler
printf( "%d\n", (int)sizeof(char[20]) ); // 20
printf( "%d\n", (int)sizeof(char[]) ); // ERROR: invalid application of 'sizeof' to incomplete type 'char[]'
----- >8-----
„People who are really serious about software should make their own hardware [A. Kay]“
Hilfreich?
0
schleiftier
14.02.10
00:03
==> TiBooX: Doch. sizeof benutzt nur Compile-Time-Informationen. Die Schreibweise mit [] ist nur Syntactical Sugar für die Pointer-Arithmetik. Wenn ich mir deine Seite ansehe, solltest du das auch wissen - verwirr hier doch nicht die Anfänger...
Hilfreich?
0
snowman-x
14.02.10
00:16
ja also char *arv[] ist das gleiche wie char **argv .....ich steht jedenfalls so in meinem buch "c programmieren von anfang an" ...nur leider steht da halt zu meinem problem keene lösung deswegen musste ich hier fragen...aber bin froh das ich schleiftier´s code nachvollziehen kann! jetzt hab ichs verstanden danke!!!
und jetzt dürfte ich auch keene probleme mit stackoverflow haben oder? und zu int lentgh = 99 noch ne frage...da muss ich doch keine werte ( also nur int length) geben oder weil ich doch später sowieso nochmal mit length = strlen(wort); die länge bestimmte oder?
kann mir jemand eig noch ein C buch empfehlen auf deutsch wo alles gut erklärt ist? oder ist da "C von a bis z" gut geeignet??
achso und noch ne letzte frage
kann ich mir eig durch ein stackoverflow mein system zerschießen??? weil hatte letztens son prob nachdem ich da bissl unvorsichtig war mit mail....oder war das nur reiner zufall?
Hilfreich?
0
TiBooX
14.02.10
01:09
snowman-x
Du hast offensichtlich immer noch nicht den Unterschied zwischen der Buffergröße und der string-Länge verstanden
char myStringBuffer[100]; // reserviert speicher für 100 chars
darin wird dann der eigentliche String abgelegt und zwar mit einer 0 am Ende '\0'
Beispiel:
char sBuffer[10];
String : "Hallo"
|Hallo•....|
wobei • die 0 am Ende des Strings
und ... weitere reservierte Speicherzellen sind
sizeof(sBuffer); // ergibt 10, die Anzahl der reservierten chars
strlen(sBuffer); // ergibt im obigen Fall 5+1=6
In der Regel kannst Du bei Unixoiden Systemen immer nur den Speicher deiner Applikation ruinieren.
„People who are really serious about software should make their own hardware [A. Kay]“
Hilfreich?
0
M@cBenutzer
14.02.10
01:18
Solange du nur Shell-Applikationen schreibst, dürfte da nicht viel passieren. Maximal ein "Segmentation fault" wegen ungültiger Indizierung (z.B. Zugriff auf einen NULL-Zeiger) kann auftreten. Also mehr als nicht funktionieren kann es nicht. (Terminal zu und weg...)
Dies gilt natürlich nur, solange du nicht auf Bestandteile des Systems zugreifst (Dateien, spezielle Speicherbereiche). Der Stackoverflow bedeutet lediglich, dass du dein für dein Programm zur Verfügung stehenden Kellerspeicher (Stack) überschritten hast. Das geht z.B. ganz leicht mit rekursiven Funktionen, wo die Haltebedingung fehlt oder nie erreicht wird.
Bei Schleiftiers Programm wird explizit per scanf eingelesen und du kannst nur Zeichenketten (der Mathematiker spricht von "Wörtern" formaler Sprachen) begrenzter Länge einlesen. Daneben existiert noch die Möglichkeit der Hauptfunktion main() wie jeder anderen Funktion auch, Argumente mit zu übergeben. Per ANSI-C-Standard sind das argc und argv[], du könntest auch selbst Argumente deklarieren, die beiden sind halt Tradition. Der Unterschied zur scanf-Variante ist, dass das Einlesen nicht mehr explizit aufgerufen wird, sondern du per Programmaufruf dies erledigst.
Der Hintergrund der Variante, die ich bevorzuge, ist, dass sich so sehr komfortabel Komponenten schreiben lassen, die im Gesamtsystem intern schon mit entsprechenden Argumenten aufgerufen werden. Dabei kann man bspw. prüfen, ob überhaupt ein Argument übergeben wurde. Das spart oft Zeit bei der Fehlersuche.
Noch zwei Empfehlungen in Sachen Literatur, die mir seinerzeit sehr geholfen haben:
und
Eine Frage mal noch, was studierst du und wann ist die Prüfung?
Grüße.
Hilfreich?
0
snowman-x
14.02.10
11:55
@ tiboox danke nochmal für die erklärung^^ soviel hab ich schon verstanden^^
@macbenutzer ich schreibe morgen! ich studiere maschinenbau im ersten semester und da muss ich eben bissl programmieren können! irgendwie kam ich mit dem einlesen lassen und umdrehen und ausgeben nicht so ganz klar aber wenn ich dein programm seh ist es eig ganz logisch und einfach danke dir!!!
habs jetzt noch ich eine main und void gespaltet wie der prof das immer haben will und es funzt sogar noch^^
also vielen dank nochmal für die schnellen lösungen und vielen erklärungen wünsche allen noch einen schönen sonntag!!
Hilfreich?
0
Kommentieren
Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.