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-x13.02.1021: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!!!!
0

Kommentare

dreyfus13.02.1021: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;
}
0
snowman-x13.02.1021:55
cool ich danke dir für die schnelle antwort ich werds mal testen!!
0
snowman-x13.02.1022: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!!!
0
dnbblah13.02.1022: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
}
0
M@cBenutzer13.02.1022: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;
}
0
re:com13.02.1022:43
also wenn java, dann wenigstens richtig bitte

edit: aar ... jetzt hab ich den Blödsinn ja auch noch kopiert ... arg
0
M@cBenutzer13.02.1022: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.
0
schleiftier13.02.1022: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;
}
0
M@cBenutzer13.02.1022: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[]?
0
re:com13.02.1022: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 ...
0
schleiftier13.02.1022: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.
0
M@cBenutzer13.02.1023: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 ?
0
snowman-x13.02.1023: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
0
TiBooX
TiBooX13.02.1023: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]“
0
schleiftier13.02.1023:49
Ne, ich mag lesbaren Code. char** geht halt schneller zu tippen...
0
TiBooX
TiBooX14.02.1000: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]“
0
schleiftier14.02.1000: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...
0
snowman-x14.02.1000: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?
0
TiBooX
TiBooX14.02.1001: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]“
0
M@cBenutzer14.02.1001: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.
0
snowman-x14.02.1011: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!!
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.