Versuchen Sie es mit normaler Linux-Programmierung Teil 7

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 = ausgeführt werden. Gibt es eine Szene, in der der Compiler dies zulässt?

Ich habe noch nie von% ld gehört, aber der Compilerfehler ist nett.

image.png

Sie kennen% ld, ohne herumzugehen. es ist fantastisch.

atoi() strtoll() strtol() strtod()

Ein System, das Zeichen in Zahlen umwandelt

Warum nicht fgets () verwenden?

get () ist besser, weil es keinen Puffer hat. Mach dir keine Sorgen fgets () ist aufgrund von Zeilenlängenbeschränkungen nicht geeignet

Nummer weglassen als n

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

Datei als Argument übergeben

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

einfaches / doppeltes Anführungszeichen wird verwirrt

Es ist ein Fehler, wenn Sie dies mit einem einfachen Anführungszeichen auf "r" setzen.

    	    f = fopen(argv[i], "r");

image.png

Ich dachte, es wäre Single, weil es ein Zeichen war, aber ... ich kann "rb" eingeben, also muss es ein Char-Typ sein. vielleicht.

Was sind Linux-Befehlsoptionen?

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 ...

Kopfbefehl mit --lines und -n

#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.

Hinweise zur Verwendung von GPU libc

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.

Verwenden Sie gdb! !! !! !! !!

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

Versuchen Sie es mit normaler Linux-Programmierung Teil 7
Versuchen Sie es mit normaler Linux-Programmierung Teil 2
Versuchen Sie es mit normaler Linux-Programmierung Teil 3
Versuchen Sie es mit normaler Linux-Programmierung Teil 4
Versuchen Sie es mit normaler Linux-Programmierung Teil 6
Versuch einer normalen Linux-Programmierung Teil 1
Lesen Sie die normale Linux-Programmierung (nur Teil 1).
[Für Memo] Linux Teil 2
Linux Standard Lehrbuch Teil 5
Linux Standard Lehrbuch Teil 4
Versuchen Sie, mit einer Shell zu programmieren!
Versuchen Sie die GUI-Programmierung mit Hy
Linux Standard Lehrbuch Memo 1 Teil 2
Verstärkungslernen 5 Versuchen Sie, CartPole zu programmieren?
Versuchen Sie, Englisch PDF Teil 1 zu übersetzen
Versuchen Sie es mit SQLAlchemy + MySQL (Teil 1)
Versuchen Sie es mit SQLAlchemy + MySQL (Teil 2)
Ton erzeugen durch Programmieren von Teil 2
Linux Standard Lehrbuch Memo Teil 6
Versuchen Sie es mit Pillow auf iPython (Teil 1)
[Für Memo] Linux Part 1 vi Editor
Versuchen Sie, OpenAM unter Amazon Linux zu installieren
Versuchen Sie es mit Pillow auf iPython (Teil 2)
Versuchen Sie es mit TensorFlow Part 2
Probieren Sie den Linux-Kernel-Sperrmechanismus aus
[Linux Convenience-Befehl] Versuchen Sie, csview einzufügen
Versuchen Sie es mit Pillow auf iPython (Teil 3).
[Bequemer Linux-Befehl] Versuchen Sie, bat einzufügen
Versuchen Sie, Linux-Befehle zu kompilieren (Cross-Compilation-Praxis)