Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Frage zu C Quellcode (https://www.delphipraxis.net/2676-frage-zu-c-quellcode.html)

Salomon 1. Feb 2003 17:13


Frage zu C Quellcode
 
Hallo,
da ich mich in C so gut wie überhaupt nicht auskenne habe ich mal eine Frage zu folgenden Code.
1. Was bewirken die "*" oder "!*" vor den Variablen?
2. Was macht die Function "!strnicmp", konnte dazu nichts in der Delphi Hilfe finden.

Code:
      cmd = buffer;
      while (*cmd && *cmd < ' ')
         cmd++; //Was macht die Schleife???

      if (!*cmd)
         continue;

      if (!strnicmp(cmd, "USER ", 5)) {
         ptr = cmd+5;
         NEXTWORD(ptr);
         strcpy(username, ptr);
#ifdef CONSOLE_OUT
   con_out("ftp_parse_t(): username = %s\n", username);
#endif
   net_send(cli_sock, "331 Password required for %s.\r\n", username);
      }
Ihr seht, mir fehlt noch total der Durchblick, aber ich denke ihr könnt das ändern :wink:
Bei dem Codeschnipsel handelt es sich übrigens um den Login Part eines FTP Servers.

Mfg
Salomon

Luckie 1. Feb 2003 17:22

  1. strnicmp ist keine Variabel, sondern eine Funktion.
  2. ! entspircht in Object Pascal dem Operator not.
  3. Warum sollten in der Delphi-Hilfe C-Funktionen erklärt sein? :roll:
  4. Kuck in einer C-Dokumentation was strnicmp macht und versuch dazu ein Object Pascal Äquivalent zu finden.
  5. * hat iregendwas mit Zeigern zu tun. Da bin ich aber in C auch nicht so bewandert.
  6. Da du anscheinend den Unterschied zwischen Variablen und Funktionen nicht kennst, solltest du ein paar Grundlagen, egal in welcher Sprache, nachholen.

Salomon 1. Feb 2003 17:45

Hi Luckie,
den Unterschied zwischen Variablen und Functionen kenne ich schon recht lange. Wenn du richtig lesen könntest würdest du sehen, das ich nirgends behauptet habe das "strnicmp" eine Variable ist 8)
Zitat:

1. Was bewirken die "*" oder "!*" vor den Variablen?
2. Was macht die Function "!strnicmp", konnte dazu nichts in der Delphi Hilfe finden.
zu 3. Hätte ja sein können das "strnicmp" eine API Function ist.
zu 4. Wo bekomme ich eine C Doku her?

OK bin schonmal um einen Operator weiter, bleiben jedoch noch etliche :?

Mfg
Salomon

Luckie 1. Feb 2003 17:50

Ich hätte schwören können, ich hätte Variable gelesen. Aber OK, sorry.

Es gibt Freeware C/C++ Kompiler, da müßte auch eine Doku dabei sein. Und wenn du sowas öfters brauchst, dann wäre ein C/C++ Buch angebracht und etwas Einarbeitung in die Sprache. Habe ich auch schon gemacht. Nur bin ich, wenn es mit den Zeigern zu sehr abdrehte, bisher immer ausgestiegen.

Und zur Not bemüh mal Google.

Salomon 1. Feb 2003 18:27

Kein Problem :wink:
C liegt mir auch nicht so, daher programmier ich ja in Delphi :D Werde mir jetzt mal bei google etwas über die grundlegenden Operatoren suchen.

Weitere Erläuterungen des Quelltext wären natürlich super.

d3g 1. Feb 2003 19:15

Zitat:

Zitat von Salomon
Was bewirken die "*" [...] vor den Variablen?

Das * ist in diesem Fall (es steht natürlich auch für Multiplikation) der Derefernzierungsoperator: ist cmd ein Pointer, so ist *cmd der Inhalt der Speicherstelle, auf die der Pointer zeigt.
Zitat:

Zitat von Salomon
Was macht die Function "!strnicmp", konnte dazu nichts in der Delphi Hilfe finden.

strnicmp() verlgleicht zwei Strings, ohne auf die Groß-und Kleinschreibung zu achten. Das dient zur Sortierung von Wörtern. Die Funktion gibt einen Wert kleiner null zurück, ist String 1 kleiner als String 2 (weiter oben im Alphabet), einen Wert > 0, ist String 1 größer als String 2 und 0, wenn beide Strings gleich groß sind.
Zitat:

Zitat von Salomon
Was macht die Schleife???

Du hast es hier mit einem C-typischen Konstrukt zu tun, das funktioniert, weil in C ein Array ein Pointer auf sein erstes Element ist. Die Expression "*cmd && *cmd < ' '" überprüft, ob ein Zeichen nicht \0 und außerdem ein darstellbares kein Zeichen ist. Ich nehme einmal an, dass buffer ein nullterminierter String ist, also ein *char oder char[]: Die Schleife geht vom ersten Zeichen an durch das Array durch und zählt jeweis den Pointer eine Stelle höher, d.h. es wird immer das nächste Element im Array überprüft. Wenn cmd auf ein darstellbares Zeichen zeigt, wird der nachfolgende Code ausgeführt. Weil der Code auch abbricht, wenn das Ende des Strings (\0) erreicht ist (Überprüfung "*cmd"), sorgt die nachfolgende if-Abfrage dafür, dass der folgende Code nicht ausgeführt wird, wenn dies geschieht (es wird zum Anfang der Schlefe gesprungen, in der sich der Code befindet, den du gepostet hast).

MfG,
d3g

Salomon 1. Feb 2003 19:48

Danke für die Erklärung. Du hast recht, "Buffer" ist als Char[Buffersize] deklariert.
Ich habe noch eine Frage zu folgender Zeile:
Code:
net_send(cli_sock, "331 Password required for %s.\r\n", username);
Dort wird der zweite String mit"\r\n" terminiert. Ist das vergleichbar mit CRLF, also #10 + #13 ?

Mfg
Salomon

Chewie 1. Feb 2003 21:04

Zitat:

Zitat von Salomon
Danke für die Erklärung. Du hast recht, "Buffer" ist als Char[Buffersize] deklariert.
Ich habe noch eine Frage zu folgender Zeile:
Code:
net_send(cli_sock, "331 Password required for %s.\r\n", username);
Dort wird der zweite String mit"\r\n" terminiert. Ist das vergleichbar mit CRLF, also #10 + #13 ?

Mfg
Salomon

Abgesehen davon, dass CRLF #13#10 und nicht #10#13 ist, hast du Recht. \r stellt #13 und \n #10 dar. Das geht u.a. auch in PHP.

Salomon 2. Feb 2003 13:08

Super, danke für den Hinweis. Ich bin schon echt verzweifelt gewesen warum der Server mich nicht verstehen will. Es lag an dem vertauschten CR LF. Danke :spin:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz