Přebírání parametrů z příkazového řádku v jazyce C: Porovnání verzí

Z Milan Kerslager
Přejít na: navigace, hledání
(Rozšíření)
m (Syntax on)
Řádka 44: Řádka 44:
 
Parametr přepínače je přístupný pomocí ukazatele ''optarg''
 
Parametr přepínače je přístupný pomocí ukazatele ''optarg''
  
      1 #include <stdio.h>
+
<source lang="c">
      2 #include <unistd.h>
+
#include <stdio.h>
      3
+
#include <unistd.h>
      4 int main (int argc, char **argv)
+
 
      5 {
+
int main (int argc, char **argv)
      6   int c;
+
{
      7   while ((c = getopt(argc, argv, "ab:")) != -1) {
+
   int c;
      8     switch (c) {
+
   while ((c = getopt(argc, argv, "ab:")) != -1) {
      9       case 'a':
+
     switch (c) {
    10         printf("Na radku byla volba: a\n");
+
       case 'a':
    11         break;
+
         printf("Na radku byla volba: a\n");
    12       case 'b':
+
         break;
    13         printf("Na radku byla volba: b, s parametrem: %s\n", optarg);
+
       case 'b':
    14         break;
+
         printf("Na radku byla volba: b, s parametrem: %s\n", optarg);
    15       case '?':
+
         break;
    16         printf("Neznama volba: %c\n", optopt);
+
       case '?':
    17         return 1;
+
         printf("Neznama volba: %c\n", optopt);
    18       default:
+
         return 1;
    19         abort();
+
       default:
    20     }
+
         abort();
    21   }
+
     }
    22   return 0;
+
   }
    23 }
+
   return 0;
 +
}
 +
</source>
  
 
Pro zpracování přepínačů, které mohou být i v dlouhé podobě (například u příkazu <CODE>ls</CODE> by to bylo možné použít <CODE>--long</CODE> místo <CODE>-l</CODE>) je potřeba použít funkci <CODE>getopt_long()</CODE>.
 
Pro zpracování přepínačů, které mohou být i v dlouhé podobě (například u příkazu <CODE>ls</CODE> by to bylo možné použít <CODE>--long</CODE> místo <CODE>-l</CODE>) je potřeba použít funkci <CODE>getopt_long()</CODE>.

Verze z 7. 9. 2008, 12:57

Při spouštění programů na příkazovém řádku můžeme jejich chování změnit pomocí přepínačů a určit, se kterými soubory budou pracovat pomocí parametrů.

Ukázka chování přepínačů

Například program ls mění své chování při zadání přepínačů -a a -l. V příkladu je tučně vyznačen vstup od uživatele. Všimněte si, že přepínače lze seskupovat:

[huzva@pluto ~]$ ls
soubor1.txt  soubor2.txt  soubor3
[huzva@pluto ~]$ ls -a
.  ..  .skryty-soubor1  .skryty-soubor2.txt  soubor1.txt  soubor2.txt  soubor3
$ ls -l
celkem 24
-rw-rw-r-- 1 ke ke   6 úno 22 17:52 soubor1.txt
-rw-rw-r-- 1 ke ke  21 úno 22 17:53 soubor2.txt
-rw-rw-r-- 1 ke ke 781 úno 22 17:53 soubor3
[huzva@pluto ~]$ ls -l -a
celkem 56
drwxrwxr-x   2 ke ke 4096 úno 22 17:53 .
drwx--x---+ 46 ke ke 4096 úno 22 17:53 ..
-rw-rw-r--   1 ke ke  336 úno 22 17:53 .skryty-soubor1
-rw-rw-r--   1 ke ke   12 úno 22 17:53 .skryty-soubor2.txt
-rw-rw-r--   1 ke ke    6 úno 22 17:52 soubor1.txt
-rw-rw-r--   1 ke ke   21 úno 22 17:53 soubor2.txt
-rw-rw-r--   1 ke ke  781 úno 22 17:53 soubor3
[huzva@pluto ~]$ ls -la
celkem 56
drwxrwxr-x   2 ke ke 4096 úno 22 17:53 .
drwx--x---+ 46 ke ke 4096 úno 22 17:53 ..
-rw-rw-r--   1 ke ke  336 úno 22 17:53 .skryty-soubor1
-rw-rw-r--   1 ke ke   12 úno 22 17:53 .skryty-soubor2.txt
-rw-rw-r--   1 ke ke    6 úno 22 17:52 soubor1.txt
-rw-rw-r--   1 ke ke   21 úno 22 17:53 soubor2.txt
-rw-rw-r--   1 ke ke  781 úno 22 17:53 soubor3

Příklad užití funkce getopt()

Níže uvedený příklad používá funkci getopt() ke zpracování přepínačů. Krátké (jednopísmenné) přepínače se mohou seskupovat, mít parametry a nebo být promíchány s vlastními parametry. Proto je pro jejich zpracování knihovní funkce vhodnější.

Pomocí prvních dvou parametrů přebírá funkce getopt počet parametrů a ukazatel na pole s řetězci tvořícími příkazový řádek. Třetím parametrem je definice přepínačů:

  • pokud je za písmenem přepínače dvojtečka, musí mít přepínač ještě parametr
  • při dvou dvojtečkách je parametr u přepínače volitelný

Parametr přepínače je přístupný pomocí ukazatele optarg

#include <stdio.h>
#include <unistd.h>

int main (int argc, char **argv)
{
  int c;
  while ((c = getopt(argc, argv, "ab:")) != -1) {
    switch (c) {
      case 'a':
        printf("Na radku byla volba: a\n");
        break;
      case 'b':
        printf("Na radku byla volba: b, s parametrem: %s\n", optarg);
        break;
      case '?':
        printf("Neznama volba: %c\n", optopt);
        return 1;
      default:
        abort();
    }
  }
  return 0;
}

Pro zpracování přepínačů, které mohou být i v dlouhé podobě (například u příkazu ls by to bylo možné použít --long místo -l) je potřeba použít funkci getopt_long().

Cvičení

Příklad 1
Napište program, který zpracovává krátké i dlouhé volby.