C’de daha önce yazdığımız programlar soldaki gibiydi. Komut satırı argümanlarını kullanarak kullanıcıdan komut satırında daha programımızı çalıştırırken input alabilir böylece daha kullanışlı programlar yazabiliriz.

commandlinearg

Konsolda kullandığımız komut satırı argümanları argümanları ile çalışır. Örneğin gcc ile myprog.c’yi adlı bir program derleyeceğimiz zaman $gcc myprog.c yazarız. Buradaki ikinci değer programa gönderdiğimiz bir komut satırı argümanıdır aslında. Eğer yalnızca gcc yazıp enter a bassaydık ve gcc bize derlemek istediğimiz dosyanın adını sorsaydı, sonrasında biz tekrar dosyanın ismini yazsaydık bu işlem oldukça sıkıcı olabilirdi. Komut satırı argümanları konsol üzerinde çalışacak programları bu şekilde hızlandırmamız için bir yönremdir.

Şimdi yukarıdaki tanımlamayı tekrar gözden geçirelim. main fonksiyonumuz parametre olarak iki değişken alıyor. İlki int tipinde argc değişkenidir. Bu değişkenlerin isimleri elbette farklı olabilirdi fakat gelenek olarak böyle yazılır. argc argument count anlamına gelir. Yani kaç tane değer gönderildiği. Fakat yine gelenekten kaynaklı programın ismi de bu sayıya dahil edilir. Örneğin $gcc myprog.c için argc değeri 2’dir.

Aşağıdaki kodu argv1.c olarak kaydedelim.

Yukarıdaki kod bir döngü içerisinde komut satırı argümanlarımızı ekrana yazdıracak.

Komut satırından aşağıdaki gibi derleyeceğiz. Derlerken gcc’yi c99 standardına alıyoruz aksi halde for içerisindeki değişken tanımlaması hata veriyor.

Çalıştıralım :

Peki bir string yerine her bir karakteri teker teker yazdırmak istersek ne yapacağız?

Bunun için ikinci bir boyuta ihtiyacımız olacak ve printf içerisinde %s yerine %c kullanacağız.

İkinci bir boyut için ikinci bir döngüye ihtiyacımız olacak.

Derleyip çalıştıralım :

argv2

Null Karakteri (\0) ve strlen

GetString gibi bir fonksiyon düşünelim. Kullanıcı “selam” yazıp enter’a bastığı zaman fonksiyon öncelikle içerisinde kaç tane karakter olduğunu bulur. Sonrasında 5 karakter var olduğundan her bir karakter için 1 byte olarak işletim sisteminden 5 byte’lık yer ister. (memory allocation)

Fonksiyon tekrar çağırıldığında ise yeni bir string gelecek. Bu yeni gelen string için açılan yer her zaman değil fakat belleğin boş olduğunu düşünürsek yüksek ihtimal öncekinin sonuna gelir. Bu iki stringin birbirine karışmaması için null karakter denilen özel bir karakter kullanılır.

strlen() herhangi bir insanın beklediği ne ise onu döndürür. Yani 5’i. Fakat gerçekte “selam”ı depolayan dizinin uzunluğu 5 değil 6 dır. Yani bilgisayar belleği 5 karakteri saklamak için 6 byte’lık yer kullanır.