argc e argv in C

Jinku Hu 12 ottobre 2023
  1. Usa la notazione int argc, char *argv[] per ottenere gli argomenti della riga di comando in C
  2. Usa memccpy per concatenare gli argomenti della riga di comando in C
argc e argv in C

Questo articolo spiegherà diversi metodi per usare gli argomenti della riga di comando, argc e argv, in C.

Usa la notazione int argc, char *argv[] per ottenere gli argomenti della riga di comando in C

Quando un programma viene eseguito, l’utente può specificare le stringhe separate da spazi chiamate argomenti della riga di comando. Questi argomenti sono resi disponibili nella funzione main del programma e possono essere analizzati come singole stringhe con terminazione null. Per accedere agli argomenti, dovremmo includere parametri come int argc, char *argv[], che rappresentano il numero di argomenti passati e l’array di stringhe contenente gli argomenti della riga di comando. La prima stringa nell’array è il nome del programma stesso secondo la convenzione; quindi, il numero di argomenti argc include il nome del programma. Possiamo stampare ogni argomento della riga di comando con una semplice iterazione attraverso l’array argv, come mostrato nell’esempio seguente.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  for (int i = 0; i < argc; i++) printf("argv[%d] = %s\n", i, argv[i]);

  exit(EXIT_SUCCESS);
}

Comando di esempio:

./program hello there

Produzione:

argv[0] = ./program
argv[1] = hello
argv[2] = there

L’array argv di stringhe con terminazione null termina con un puntatore NULL per indicare l’ultimo argomento. Quindi, possiamo utilizzare questa caratteristica per implementare il bucle di stampa degli argomenti valutando lo stesso puntatore argv e incrementandolo fino a quando è uguale a NULL. Nota che è meglio creare un puntatore separato char* per il bucle per preservare l’indirizzo originale dell’array nel caso in cui sia necessario in seguito nel programma. Il seguente codice di esempio presuppone che lo stesso comando venga eseguito come nell’esempio precedente.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  char **ptr;
  for (ptr = argv; *ptr != NULL; ptr++) printf("%s\n", *ptr);

  exit(EXIT_SUCCESS);
}

Produzione:

./program
hello
there

Usa memccpy per concatenare gli argomenti della riga di comando in C

La funzione memccpy fa parte delle utilità di stringa della libreria standard usate per concatenare le stringhe dell’array argv. Nota che memccpy è simile a memcpy tranne per il fatto che richiede il quarto argomento per specificare il carattere quando interrompere la copia. Sfruttiamo quest’ultima caratteristica per copiare solo il contenuto della stringa e fermarci a terminare il byte nullo. Nell’esempio seguente, controlliamo se l’utente ha fornito esattamente due argomenti (eccetto il nome del programma) e solo allora continuiamo l’esecuzione del programma. Di conseguenza, concateniamo due chiamate memccpy per copiare entrambi gli argomenti e stampare la stringa concatenata nello stdout.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
  if (argc != 3) {
    printf("Usage: ./program string1 string2\n");
    exit(EXIT_FAILURE);
  }

  size_t size = strlen(argv[1]) + strlen(argv[2]);
  char buf[size];

  memccpy(memccpy(buf, argv[1], '\0', size) - 1, argv[2], '\0', size);
  printf("%s\n", buf);

  exit(EXIT_SUCCESS);
}

Produzione:

hellothere
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Articolo correlato - C Process