21 Ağustos 2017 Pazartesi

Komut Satırı Parse Etme

C
argv ne anlama gelir
argv "argument  values" demek. Açıklaması şöyle
The program stores the command line strings in memory and stores the address of each string in an array of pointers. The address of this array is stored in the second argument. By convention, this pointer to pointers is called argv, for argument values .
argv ne zamana kadar kullanılabilir
main metodun çıkılmadığı müddetçe argv  kullanılabilir.
The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination.
argv'de kaç string bulunur?
If the value of argc is greater than zero, the string pointed to by argv[0] represents the program name; argv[0][0] shall be the null character if the program name is not available from the host environment. If the value of argc is greater than one, the strings pointed to by argv[1] through argv[argc-1] represent the program parameters.
argv bellekte nasıl tutulur.
Şöyle tutulur.
                  Some
                  array

                 +-------+        +------+------+-------------+------+
argv ----------> |       |        |      |      |             |      |
                 | 0x100 +------> |      |      | . . . . . . |      |  Prog. Name
         0x900   |       |        |      |      |             |      |
                 |       |        +------+------+-------------+------+
                 +-------+         0x100  0x101
                 |       |        +------+------+-------------+------+
                 | 0x205 |        |      |      |             |      |
         0x904   |       +------> |      |      | . . . . . . |      |  Arg1
                 |       |  .     |      |      |             |      |
                 +-------+        +------+------+-------------+------+
                 |  .    |  .      0x205  0x206
                 |  .    |
                 |  .    |  .
                 |  .    |
                 +-------+  .     +------+------+-------------+------+
                 |       |        |      |      |             |      |
                 | 0x501 +------> |      |      | . . . . . . |      |  Argargc-1
                 |       |        |      |      |             |      |
                 +-------+        +------+------+-------------+------+
                 |       |         0x501  0x502
                 | NULL  |
                 |       |
                 +-------+


0xXXX Represents memory address
Uygulamamız şöyle çağrılıyor olsun.
add_fractions 1/2 2/3
Bu durumda şu değerleri alırız.
argv[0] = "add_fractions"
argv[1] = "1/2"
argv[2] = "2/3"
argv[3] = 0
Not : Windows'ta argv[0] "c:\add_fractions.exe" şeklinde gelir.

Dolayısıyla uygulama ismi hariç geri kalan parametreler şöyle bir döngü ile alınabilir.
for (int i = 1; i < argc;  i++) {...}

shell glob veya * wildcard
Shell ile * verilerek çağırılan bir program bulunduğu dizindeki tüm dosyaları parametre olarak alır.
./myprogram '*' şeklinde çağırılırsa parametre olarak * karakterini alır.

C++
C++ ile C aynı şekilde çalışıyorlar. argv[0] uygulamanın çalışmasına sebep olan komutu içerir.

  1. ...If argc is nonzero these arguments shall be supplied in argv[0] through argv[argc-1] as pointers to the initial characters of null-terminated multibyte strings (ntmbs s) (17.5.2.1.4.2) and argv[0] shall be the pointer to the initial character of a ntmbs that represents the name used to invoke the program or "".
Örnek
Tüm parametreleri dolaşmak istersek şöyle yaparız.
#include <stdio.h>

int main( int argc, char * argv[] )
{
  for ( argc--, argv++; argc > 0; argc--, argv++ )
  {
    puts( *argv );
  }        

  return 0;
}
Çıktı olarak şunu alırız.
first 
second 
third
Örnek
Uygulam ismi dahil tüm parametreleri dolaşmak istersek şöyle yaparız.
#include <stdio.h>

int main( int argc, char * argv[] )
{
  for ( /*argc--, argv++*/; argc > 0; argc--, argv++ )
  {
    puts( *argv );
  }        

  return 0;
}
Çıktı olarak şunu alırız.
./prog.exe
first 
second 
third
Örnek
Uygulamanın şöyle çağrılmasını istiyor olalım.
./knapsack <capacity> <filename>
Şöyle yaparız.
int main(int argc, char * const argv[])
{
  std::vector<Item> items;
  if (argc != 3)
  {
    std::cerr << "Usage: ./knapsack <capacity> <filename>";
    return -1;
  }

  int capacity;
  std::stringstream iss(argv[1]);

  if (!(iss >> capacity) || (capacity < 0))
  {
    std::cerr << "Error..." << std::endl;
    return -1;
  }   
}
Shared Object İçinden Erişim
Linux'ta Shared Object içindeki koddan argv'ye erişmek mümkün.


Hiç yorum yok:

Yorum Gönder