Es scheint ein berühmtes Buch zu sein, also habe ich es gekauft <a target = "_ blank" href = "https://www.amazon.co.jp/gp/product/4797328355/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4797328355&linkCode=as2&tag=lespacetr2f2 > Normale Linux-Programmierung Der königliche Weg zur gcc-Programmierung, der aus dem Mechanismus von Linux gelernt werden kann <img src = "// ir-jp.amazon-adsystem.com/e/ir?t=lespacetranqu-22&l=am2&o=9&a=4797328355" "width =" 1 "height =" 1 "border =" 0 "alt =" "style =" border: none! Wichtig; Rand: 0px! Wichtig; "/> <a target = "_ blank" href = "https://www.amazon.co.jp/gp/product/B075ST51Y5/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B075ST51Y5&linkCode=as2&a0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa > Gewöhnliche Linux-Programmierung 2. Ausgabe: Der königliche Weg der gcc-Programmierung, der aus dem Mechanismus von Linux gelernt werden kann <img src = "// ir-jp.amazon-adsystem.com/e/ir?t=lespacetranqu-22&l=am2&o=" 9 & a = B075ST51Y5 "width =" 1 "height =" 1 "border =" 0 "alt =" "style =" border: none! Wichtig; Rand: 0px! Wichtig; "/>
Versuchen Sie es mit normaler Linux-Programmierung Teil 1 https://qiita.com/uturned0/items/b9ae846f2aff5865c074 Versuchen Sie es mit normaler Linux-Programmierung Teil 2 https://qiita.com/uturned0/items/56beac990cdd6f1059ed Versuchen Sie es mit normaler Linux-Programmierung Teil 3 https://qiita.com/uturned0/items/675092da8aa89c4b1ff0 Teil 4 https://qiita.com/uturned0/items/8f5765cfc0f0be8a1981 Teil 5 https://qiita.com/uturned0/items/ab97deb489c994a836da Teil 6 https://qiita.com/uturned0/items/b7df48e87ae9170f3698 Teil 7 https://qiita.com/uturned0/items/263151cf7c83bff7fac1
chapter 7
Machen Sie einen Kopfbefehl
#include <stdio.h>
#include <stdlib.h>
static void do_head(FILE *f, long nlines);
int
main(int argc, char *argv[])
{
if (argc != 2) {
fprintf(stderr, "Usage: %s n\n", argv[0]);
exit(1);
}
do_head(stdin, atol(argv[1]));
exit(0);
}
static void
do_head(FILE *f, long nlines)
{
int c;
if (nlines <= 0) return;
while ((c=getc(f)) != EOF) {
if (putchar(c) < 0) exit(1);
if (c == '\n') {
nlines--;
if (nlines == 0) return;
}
}
}
execute
$ gcc -Wall head.c && cat head.c | ./a.out 2
#include <stdio.h>
#include <stdlib.h>
gerührt!
atol()
atol, atoll, atol_l, atoll_l -- convert ASCII string to long or long long integer long atol(const char *str);
Machen Sie die Zeichenfolge zu einer langen Zahl. Was ist eine Besetzung? ich habe es versucht
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
char *str = "123";
printf("%s \n",str);
// printf("%d",str); //Dies führt zu einem Fehler
//Weil der Rückgabewert lang ist%Wenn dies nicht der Fall ist, tritt ein Fehler auf.
printf("%ld \n", atol(str));
//Versuchen Sie es in eine lange Variable zu setzen
unsigned long n = atol(str);
printf("%ld \n", n);
//printf%d war ein Fehler, aber Sie können ihn in eine int-Variable einfügen ...
unsigned int i = atol(str);
printf("%d \n", i);
}
execute
$ gcc -Wall atol.c && ./a.out
123
123
123
123
Es war Casting. Im Falle von long kann printf nur ausgeführt werden, wenn es auf "% ld" gesetzt ist. Fehler, wenn% d. Es kann jedoch int n =
Ich habe noch nie von% ld gehört, aber der Compilerfehler ist nett.
Sie kennen% ld, ohne herumzugehen. es ist fantastisch.
atoi() strtoll() strtol() strtod()
Ein System, das Zeichen in Zahlen umwandelt
get () ist besser, weil es keinen Puffer hat. Mach dir keine Sorgen fgets () ist aufgrund von Zeilenlängenbeschränkungen nicht geeignet
nlines = number of lines
Es scheint die Sprache Eiffel zu imitieren. Vielleicht ist es C.
Eiffel ist eine stark typisierte (natürliche) objektorientierte Sprache, die von Bertrand Meyer entworfen wurde. http://guppy.eng.kagawa-u.ac.jp/~kagawa/publication/eiffel.pdf
Ich habe es vergessen, weil ich etwas Zeit hatte, aber ich erinnerte mich daran. fopen ().
#include <stdio.h>
#include <stdlib.h>
static void do_head(FILE *f, long nlines);
int
main(int argc, char *argv[])
{
long nlines;
int i ;
if (argc < 2) {
fprintf(stderr, "Usage: %s n\n", argv[0]);
exit(1);
}
nlines = atol(argv[1]);
if (argc == 2) {
do_head(stdin, nlines);
} else {
for (i=2; i<argc; i++) {
FILE *f;
f = fopen(argv[i], "r");
if (!f) {
perror(argv[i]);
exit(1);
}
do_head(f, nlines);
fclose(f);
}
}
exit(0);
}
static void
do_head(FILE *f, long nlines)
{
int c;
if (nlines <= 0) return;
while ((c=getc(f)) != EOF) {
if (putchar(c) < 0) exit(1);
if (c == '\n') {
nlines--;
if (nlines == 0) return;
}
}
}
reulst
$ gcc -Wall head2.c && ./a.out 3 txt .git/config
abc
xyz
[core]
repositoryformatversion = 0
filemode = true
Es ist ein Fehler, wenn Sie dies mit einem einfachen Anführungszeichen auf "r" setzen.
f = fopen(argv[i], "r");
Ich dachte, es wäre Single, weil es ein Zeichen war, aber ... ich kann "rb" eingeben, also muss es ein Char-Typ sein. vielleicht.
Mit oder ohne Parameter ls -a head -n 10
long option / short option head --line head -n
Ich habe noch nie gesagt "Lass es uns zu einer langen Option machen", also denk dran. Lange Option gefällt mir.
Ob nach langer Option = erforderlich ist, hängt vom Befehl ab. Ärgerlicher Ort. Der Kopf spielt keine Rolle.
head --line 5 head --line=5
-
allein ist" Enter from stdin "
--
Eine einzelne Einheit wird verwendet, wenn Sie eine Zeichenfolge übergeben möchten, die mit einem Minus als Argument beginnt, z. B." Optionsanalyse hier stoppen ".
Wie.
Ich verstehe --
nicht wirklich, weil ich es nicht oft benutze. Die, die ich am häufigsten benutze, ist git checkout --index.html
(die geänderte index.html zurücksetzen). Dies kann daran liegen, dass der Dateiname "-" enthalten kann, das das Argument nach "-
" ist. Ist das so. Ich frage mich, ob ich eine Regel hätte aufstellen sollen, um so zu analysieren. Das war's
getopt() Funktion zur Analyse kurzer Optionen. Sieb. Unter UNIX. Es ist wunderbar.
Ah. Ich habe das in Bash-Skript gesehen. Nach alldem. Mann hat getopt (1) und getopt (3).
GETOPT (1) BSD General Commands Manual GETOPT(1) getopt -- parse command options GETOPT (3) BSD Library Functions Manual GETOPT(3) getopt -- get option character from command line argument list
Sie können die Verarbeitung für jede Option mit while + switch case festlegen. Ich denke, ich sollte mich daran erinnern, weil es gut aussieht, aber ich habe es nur grob gelesen.
Bewegung ist mit und ohne Parameter unterschiedlich
Zum Beispiel sind mit head -n 5
die globalen Variablen, die getopt hat, wie folgt.
optopt = n //Beachten Sie, dass der Bindestrich weg ist
optarg = 5 //Dies ist der Parameter
optind = 2 //argv index
Nun, es ist gerade erst, aber ist es eine Wortdefinition wie option = parameter anstelle von key = value? Der Wert ist ein Parameter. Ist das so.
Beenden Sie die Analyse mit -
und-
, aber seien Sie vorsichtig, da sich die Position von optind für jede dieser beiden ändert. -
bleibt. --
Springt zum nächsten Argument.
getopt_long(3)
int
getopt_long(int argc, char * const *argv, const char *optstring, const struct option *longopts, int *longindex);
Sie können auch lange Optionen analysieren! Oh ~~ der, den ich wissen wollte. Dafür gibt es keinen Befehl. Es scheint, dass es nur in GNU libc ist.
Muu. Abgelenkt und heute nicht gut. YO schlafen
aufgewacht. Ich werde ein wenig tun.
Ich habe das Wort "Mitglied" nicht verstanden, um mehr zu lesen, also habe ich gelernt
Wie bei Strukturen werden die Komponenten einer Klasse als Mitglieder bezeichnet. Es gibt Mitgliedsvariablen und Mitgliedsfunktionen, aber es ist dasselbe wie beim Schreiben gewöhnlicher Variablendeklarationen und Funktionsprototypen. Da es hier deklariert ist, muss außen keine Prototypdeklaration geschrieben werden. https://cpp-lang.sevendays-study.com/day2.html#:~:text=%E3%83%A1%E3%83%B3%E3%83%90%E5%A4%89%E6%95%B0%E3%83%BB%E3%83%A1%E3%83%B3%E3%83%90%E9%96%A2%E6%95%B0,%E3%82%92%E6%9B%B8%E3%81%8F%E5%BF%85%E8%A6%81%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82
Machen wir es mit dem Gefühl von Klassenvariablen und Klassenmethoden.
Wenn Sie --help & -h mit flags = NULL, val = 'h' verknüpfen möchten, scheint es, als würde Sie h von getopt (3) aufrufen, wenn --help kommt. es ist fantastisch
Die Option, die einen booleschen Wert (1 oder 0) annimmt, kann in der Variablen so wie sie ist wiedergegeben werden.
int opt_all = 0;
struct option[] = {
{"--all", no_argument, &opt_all, 1},
opt_all ist standardmäßig Null, und wenn --all kommt, sollte opt_all auf 1 gesetzt werden. Was ist "&"?
Zeigen Sie die Adresse der Variablen & var selbst an https://qiita.com/pen2000/items/fc5b06795dce3e0f679c
Es war ein Zeiger. Vielleicht habe ich es mit * deklariert und mit & verwendet. Es ist, als würde man 1 an die Stelle setzen, an der sich opt_all befindet. C-lang ist schwer ...
#include <stdio.h>
#include <stdlib.h>
#define _GNU_SOURCE
#include <getopt.h> //Lesen Sie die Prototypdeklaration von GNU SOURCE
static void do_head(FILE *f, long nlines);
#define DEFAULT_N_LINES 10
static struct option longopts[] = {
{"lines", required_argument, NULL, 'n'},
{"help", no_argument, NULL, 'h'},
{0, 0, 0, 0} // <--------Markieren, dass es das letzte Arrangement ist. Routine
};
int
main(int argc, char *argv[])
{
int opt;
long nlines = DEFAULT_N_LINES;
while ((opt = getopt_long(argc, argv, "n:", longopts, NULL)) != -1) {
switch (opt) {
case 'n':
nlines = atoi(optarg); //Die Anzahl der Zeilen wird optarg angegeben
break;
case 'h':
fprintf(stdout, "Usage: %s [-n LINES] [FILE ...]\n", argv[0]);
exit(0);
case '?':
//Da dies eine Fehlerbehandlung ist, ähnelt sie stderr. Der Inhalt ist getopt_lange wird es dir geben!
fprintf(stderr, "Usage: %s [-n LINES] [FILE ...]\n", argv[0]);
exit(1);
}
}
if (optind == argc) {
do_head(stdin, nlines);
} else {
int i;
for (i=optind; i < argc; i++) {
FILE *f;
f = fopen(argv[i], "r");
if (!f) {
perror(argv[i]);
exit(1);
}
do_head(f, nlines);
fclose(f);
}
}
exit(0);
}
static void
do_head(FILE *f, long nlines)
{
int c;
if (nlines <= 0) return;
while ((c=getc(f)) != EOF) {
if (putchar(c) < 0) exit(1);
if (c == '\n') {
nlines--;
if (nlines == 0) return;
}
}
}
result
@local:~/repos/futu$ gcc -Wall head3.c && ./a.out -n 3 txt
0a
1b
2c
@local:~/repos/futu$ gcc -Wall head3.c && ./a.out --lines 3 txt
0a
1b
2c
@local:~/repos/futu$
Es bewegte sich.
Was war ein Array {} anstelle von []?
Was ist das n:
?
getopt_long(argc, argv, "n:", longopts, NULL)
const char * optdecl
Ist dies eine Optionsdeklaration? Listen Sie die zu analysierenden Optionen auf. Wenn -a, -t, -x
, können Sie tax
verwenden. Fügen Sie für Argumente, die Parameter annehmen, am Ende :
hinzu. Wenn x einen Wert benötigt, dann x:
. Beim Mischen mit anderen spielt es keine Rolle, wie die Reihenfolge lautet, nur das x
und:
bleiben zusammen, um einen Klumpen zu bilden. tax:
oder x: ta
.
Die Option, diese Zeit zu verwenden, ist ↓
Hier werden nur Abkürzungen angegeben. Dann h und n: anstelle von n, weil n einen Parameter nimmt. -n 10
für 10 Zeilen. Aber das dritte Argument ist nur "n:", nicht "hn:". Ich konnte den Grund dafür nicht verstehen. Es heißt "Schreiben Sie nur die kurzen Optionen, die Sie analysieren möchten", aber was ist Analyse? Ist Switch Case'h 'nicht eine Analyse? Unbekannt.
if (optind == argc) {
Zu diesem Zeitpunkt werden in optind (Index des int argv-Arrays) alle definierten Optionen verarbeitet. Die Argumente, die einzeln eingegeben werden, sind normale Argumente außer Optionen. Die Teile a.txt und b.txt von head --lines 10 a.txt b.txt
. Der Rest wird durch Drehen dieses Arguments verarbeitet.
Sie verwenden wahrscheinlich getopt () in getopt_long und es wird aus GNC libc gezogen. Die C-Sprache funktioniert unter jedem Betriebssystem, aber die mit GNC libc funktioniert nur unter Linux. Es gibt keine GNU-Fenster Wenn Sie GNU libc verwenden, erkennen Sie, dass es nur unter Linux verwendet werden kann.
Kita! !! !! Ich wollte wissen! !! !!
Ich lese dieses Buch
<a target = "_ blank" href = "https://www.amazon.co.jp/gp/product/4797328355/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4797328355&linkCode=as2&tag=lespacetr2f2 > Gewöhnliche Linux-Programmierung Der Königsweg der gcc-Programmierung, der aus dem Mechanismus von Linux gelernt werden kann <a target = "_ blank" href = "https://www.amazon.co.jp/gp/product/B075ST51Y5/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B075ST51Y5&linkCode=as2&a0aaa > Gewöhnliche Linux-Programmierung 2. Ausgabe: Der Königsweg der gcc-Programmierung, der aus dem Mechanismus von Linux gelernt werden kann
Recommended Posts