C
argv ne anlama gelir
argv "argument values" demek. Açıklaması şöyle
main metodun çıkılmadığı müddetçe argv kullanılabilir.
argv bellekte nasıl tutulur.
Şöyle tutulur.
Dolayısıyla uygulama ismi hariç geri kalan parametreler şöyle bir döngü ile alınabilir.
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.
Tüm parametreleri dolaşmak istersek şöyle yaparız.
Uygulam ismi dahil tüm parametreleri dolaşmak istersek şöyle yaparız.
Uygulamanın şöyle çağrılmasını istiyor olalım.
Linux'ta Shared Object içindeki koddan argv'ye erişmek mümkün.
argv ne anlama gelir
argv "argument values" demek. Açıklaması şöyle
argv ne zamana kadar kullanılabilirThe 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 .
main metodun çıkılmadığı müddetçe argv kullanılabilir.
argv'de kaç string bulunur?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.
If the value ofargc
is greater than zero, the string pointed to byargv[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 ofargc
is greater than one, the strings pointed to byargv[1]
throughargv[argc-1]
represent the program parameters.
Şö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.
Örnek
...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 "".
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
ÖrnekUygulam 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
ÖrnekUygulamanı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şimLinux'ta Shared Object içindeki koddan argv'ye erişmek mümkün.
Hiç yorum yok:
Yorum Gönder