C Programlama Dersi – XIII

Bu yazıda öğrenecekleriniz:

Katarlar ( String )

Dizileri ve çok boyutlu dizileri gördük. Katar dediğimiz şey de aslında bir dizidir.Değişken tipi char yani karakter olan diziler, ‘katar’ ya da İngilizceadıyla ‘string’ olarak isimlendirilirler.

Katarları, şimdiye kadar gördüğümüz dizilerden ayıran, onları farklı kılanözellikleri yoktur. Örneğin bir tam sayı ( int ) dizisinde, tamsayıları saklarken; bir karakter dizisinde -yani katarda- karakterleri( char ) saklarız. Bunun dışında bir fark bulunmaz. Ancak sıkkullanılmalarına paralel olarak, katarlara ayrı bir önem vermek gerekir. Yaptığınızişlemler bilimsel ve hesaplama ağırlıklı değilse, hangi dili kullanırsanızkullanın, en çok içli dışlı olacağınız dizi tipi, karakter dizileridir. İsimler,adresler, kullanıcı adları, telefonlar vs… sözle ifade edilebilecek her şey içinkarakter dizilerini kullanırız. Katarlar işte bu yüzden önemlidir!

Karakter dizilerine İngilizce’de String dendiğini belirtmiştik. String; ip,bağ, kordon gibi anlamlar taşıyor. İlk olarak katar adını kim münasipgördü bilmiyorum. Muhtemelen bellek hücrelerine peşi sıra dizilen karakterlerin,vagonlara benzetilmesiyle, String değişken tipi Türkçe’ye katar olarakçevrildi. ( Arapça kökenli Türkçe bir kelime olan katar, ‘tren’ anlamınagelmektedir. ) Daha uygun bir isim verilebilirdi ya da sadece ‘karakter dizisi’de diyebilirdik. Fakat madem genel kabul görmüş bir terim var; yazımız içersindebiz de buna uyacağız. String, katar ya da karakter dizisi hiç farketmez; hepsiaynı kapıya çıkıyor: Değişken tipi karakter olan dizi…

Katarlarda printf( ) ve scanf( ) Kullanımı

Katarlarla, daha önce gördüğümüz diziler arasında bir farkın olmadığını söylemtiştik.Bu sözümüz, teorik olarak doğru olsa da, pratikte ufak tefek farkları kapsam dışı bırakıyor. Hatırlayacaksınız, dizilerde elemanlara değer atama ya da onlardan değerokuma adım adım yapılan bir işlemdi. Genellikle bir döngü içersinde, her dizi elemanı için scanf( ) veya printf( ) fonksiyonunu çağırmamızgerekiyordu. Katarlar için böyle bir mecburiyet bulunmuyor. Tek bir kelimeyi, tekbir scanf( ) fonksiyonuyla okutabilir ve elemanlara otomatikdeğer atayabilirsiniz. Yani “Merhaba” şeklinde bir girdi-input gelirse, 3.dizielemanı ‘r’ olurken; 6.dizi elemanı ‘b’ olur. Önceki dizilerde gördüğümüzün aksine,eleman atamaları kendiliğinden gerçekleşir. Aşağıdaki örneği inceleyelim:
#include<stdio.h>
int main( void )
{
char isim[30];
printf( “İsim giriniz> “);
scanf( “%s”, isim );
printf( “Girdiğiniz isim: %s\n”, isim );
return 0;
}

Örneğimizde 30 karakterlik bir karakter dizisi tanımlayarak işe başladık.Bunun anlamı girdileri saklayacağımız ‘isim’ katarının 30 karakterboyutunda olacağıdır. Ancak bu katara en fazla 29 karakterlik bir kelimeatanabilir. Çünkü katarlarda, kelime bitiminden sonra en az bir hücre boş bırakılmalıdır. Bu hücre ‘Boş Karakter’ ( NULL Character )tutmak içindir. Boş karakter “\0” şeklinde ifade edilir. C programlamadilinde, kelimelerin bittiğini boş karakterlerle anlarız. Herhangi bir katarı boş karakterle sonlandırmaya, ‘null-terminated’ denmektedir.

Bu arada katarlara değer atarken ya da katarlardan değer okurken, sadece kataradını yazmamızın yettiğini farketmişsinizdir. Yani scanf( ) fonksiyonuiçersine & işareti koymamız gerekmiyor. Çünkü scanf( ), katarın ilkadresinden başlayarak aşağıya doğru harfleri tek tek ataması gerektiğini biliyor.( Aslında biliyor demek yerine, fonksiyonun o şekilde yazıldığını söylememizdaha doğru olur. )

Katarların, esasında bir dizi olduğundan bahsetmiştik. Şimdi bunun uygulamasını yapalım. Katara değer atamak için yine aynı kodu kullanırken; katardandeğer okumak için kodumuzu biraz değiştirelim:
#include<stdio.h>
int main( void )
{
char isim[30];
int i;
printf( “İsim giriniz> “);
scanf( “%s”, isim );

printf( “Girdiğiniz isim: “);
for( i = 0; isim[i]!=’\0′; i++ )
printf( “%c”, isim[i] );
printf(“\n”);

return 0;
}

Daha önce tek bir printf( ) fonksiyonuyla bütün katarı yazdırabilirken,bu sefer katar elemanlarını tek tek, karakter karakter yazdırmayı tercih ettik.Çıkan sonuç aynı olacaktır fakat gidiş yolu biraz farklılaştı. Özellikle for döngüsü içersinde bulunan ” isim[i]!=’\0′ ” koşuluna dikkatetmek gerekiyor. İsteseydik, ” i < 30 ” yazar ve katarınbütün hücrelerini birer birer yazdırabilirdik. Fakat bu mantıklı değil! 30karakterlik bir dizi olsa bile, kullanıcı 10 harften oluşan bir isim girebilir.Dolayısıyla kalan 20 karakteri yazdırmaya gerek yoktur. Kelimenin neredesonlandığını belirlemek için “isim[i]!=’\0′” koşulunu kullanıyoruz. Bununanlamı; isim katarının elemanları, “\0” yani boş karakterere ( NULLCharacter ) eşit olmadığı sürece yazdırmaya devam edilmesidir. Ne zaman kikelime biter, sıradaki elemanın değeri “\0” olur; işte o vakit döngüyüsonlandırmamız gerektiğini biliriz.

Yukardaki örneğimize birden çok kelime girdiyseniz, sadece ilk kelimenin alındığını farketmişsinizidir. Yani “Bugün hava çok güzel.” şeklinde bir cümlegirdiğiniz zaman, katara sadece “Bugün” kelimesi atanır. Eğer aynı andabirden fazla kelime almak istiyorsanız, ayrı ayrı belirtilmesi gerekir.
#include<stdio.h>
int main( void )
{
char isim[25], soyad[30];
printf( “Ad ve soyad giriniz> “);
scanf( “%s%s”, isim, soyad );
printf( “Sayın %s %s, hoş geldiniz!\n”, isim, soyad );
return 0;
}

gets( ) ve puts( ) Fonksiyonları

Gördüğünüz gibi aynı anda iki farklı kelime alıp, ikisini birden yazdırdık. Fakatscanf( ) fonksiyonu “Bugün hava çok güzel.” cümlesini tek birkatara alıp, atamak için hâlen yetersizdir. Çünkü boşluk gördüğü noktada, veriyialmayı keser ve sadece “Bugün” kelimesinin atamasını yapar. Boşluk içerenbu tarz cümleler için puts( ) ve gets( )fonksiyonları kullanılmaktadır. Aşağıdaki örnek program, 40 harfi geçmeyecek hercümleyi kabul edecektir:
#include<stdio.h>
int main( void )
{
char cumle[40];
printf( “Cümle giriniz> “);
gets( cumle );
printf( “Girdiğiniz cümle:\n” );
puts( cumle );
return 0;
}

gets( ) isminden anlayacağınız ( get string ) gibikatara değer atamak için kullanılır. puts( )( put string ) ise, bir katarın içeriğini ekrana yazdırmaya yarar.gets( ) atayacağı değerin ayrımını yapabilmek için ‘\n’aramaktadır. Yani klavyeden Enter’a basılana kadar girilen her şeyi, tek bir kataraatayacaktır. puts( ) fonksiyonuysa, printf( ) ile benzer çalışır.Boş karakter ( NULL Character ) yani ‘\0’ ulaşana kadar katarı yazdırır; printf( ) fonksiyonundan farklı olarak sonuna ‘\n’koyarak bir alt satıra geçer. Oldukça açık ve basit kullanımlara sahipolduklarından, kendiniz de başka örnekler deneyebilirsiniz.

Katarlara İlk Değer Atama

Bir katar tanımı yaptığınız anda, katarın bütün elemanları otomatik olarak ‘\0’ile doldurulur. Yani katarın bütün elemanlarına boş karakter (NULL Character)atanır. Dilerseniz, katarı ortaya çıkartırken içine farklı değerler atayabilirsiniz.Katarlarda ilk değer ataması iki şekilde yapılır.

Birinci yöntemle değer ataması yapacaksanız, istediğiniz kelimeyi bir bütünolarak yazarsınız:
#include<stdio.h>
int main( void )
{
// Her iki katarada ilk deger
// atamasi yapiliyor. Ancak
// isim katarinda, boyut
// belirtilmezken, soyad katarinda
// boyutu ayrica belirtiyoruz.
char isim[] = “CAGATAY”;
char soyad[5] = “CEBI”;
printf( “%s %s\n”, isim, soyad );

return 0;
}

İkinci yöntemdeyse, kelime bütün olarak yazılmaz. Bunun yerine harf harfyazılır ve sonlandırmak için en sonuna boş karakter ( NULL ) eklenir:
#include<stdio.h>
int main( void )
{
char isim[] = { ‘C’, ‘A’, ‘G’, ‘A’,
‘T’, ‘A’, ‘Y’, ‘\0’ };
char soyad[5] = { ‘C’, ‘E’, ‘B’, ‘I’, ‘\0’ };
printf( “%s %s\n”, isim, soyad );
return 0;
}

Ben ilk değer ataması yapacağım durumlarda, ilk yolu tercih ediyorum. İkinciyöntem, daha uzun ve zahmeti…

Biçimlendirilmiş ( Formatlı ) Gösterim

Daha önce float tipindeki bir sayının, noktadan sonra iki basamağını göstermektüründen şeyler yapmıştık. Örneğin printf( ) fonksiyonu içersinde,sayıyı %.2f şeklinde ifade ederseniz, sayının virgülden sonra sadece iki basamağı gösterilir. Yada %5d yazarak tam sayıları gösterdiğiniz bir durumda, sayı tek birrakamdan dahi oluşsa, onun için 5 rakamlık gösterim yeri ayrılır. Aynı şekildebiçimlendirilmiş ( formatlı ) gösterim, katarlarda da yapılmaktadır.

Katarları biçimlendirilmiş şekilde göstermeyi, örnek üzerinden anlatmakdaha uygun olacaktır:
#include<stdio.h>
int main( void )
{
char cumle[20] = “Denemeler”;

// Cumleyi aynen yazar:
printf( “%s\n”, cumle );

// 20 karakterlik alan ayirir
// ve en saga dayali sekilde yazar.
printf( “%20s\n”, cumle );

// 20 karakterlik alan ayirir
// ve en saga dayali sekilde,
// katarin ilk bes kelimesini
// yazar
printf( “%20.5s\n”, cumle );

// 5 karakterlik alan ayirir
// ve en saga dayali sekilde yazar.
// Eger girilen kelime 5 karakterden
// buyukse, kelimenin hepsi yazilir.
printf( “%5s\n”, cumle );

// 20 karakterlik alan ayirir
// ve sola dayali sekilde yazar.
// Sola dayali yazilmasi icin
// yuzde isaretinden sonra, –
// (eksi) isareti konulur.
printf( “%-20s\n”, cumle );

return 0;
}

Örneğimizde bulunan formatlama biçimlerini gözden geçirirsek:
•%20s, ekranda 20 karakter alan ayrılacağı anlamına gelir. Katar, en sağadayanır ve “Denemeler” yazılır.
•%.5s olursa 5 karakterlik boşluk ayrılır. Yüzde işaretinden sonranokta olduğu için katarın sadece ilk beş harfi yazdırılır. Yani sonuç”Denem” olacaktır. %20.5s yazıldığında, 20 karakterlik boşluk ayrılması istenmiş ancak katarın sadece ilk 5 harfi bu boşluklara yazılmıştır.
•%5s kullanırsanız, yine 5 karakterlik boşluk ayrılacaktır. Ancak yüzdeden sonranokta olmadığı için, katarın hepsi yazılır. Belirtilen boyutu aşan durumlarda,eğer noktayla sınır konmamışsa, katar tamamen gösterilir. Dolayısıyla çıktı,”Denemeler” şeklinde olacaktır.
•Anlattıklarımızın hepsi, sağa dayalı şekilde çıktı üretir. Eğer sola dayalı bir çıktı isterseniz, yüzde işaretinden sonra ‘-‘ (eksi) işareti koymanızgerekir. Örneğin %-20.5s şeklinde bir format belirlerseniz, 20 karakterlikboşluk ayarlandıktan sonra, sola dayalı olarak katarın ilk 5 harfiyazdırılacaktır. İmleç ( cursor ), sağ yönde 20 karakter sonrasınadüşecektir.

Standart Katar Fonksiyonları

Katarlarla daha kolay çalışabilmek için, bazı hazır kütüphane fonksiyonlarındanbahsedeceğiz. Bu fonkisyonlar, string kütüphanesinde bulunuyor. Bu yüzden,programınızın başına, #include<string.h> eklemeniz gerekiyor.

* strlen( ) fonksiyonuyla katar boyutu bulma

Dizi boyutuyla, katar uzunluğunun farklı şeyler olduğundan bahsetmiştik. Diziboyutu, 40 karakter olacak şekilde ayarlanmışken, dizi içinde sadece 7 karakterlik”Merhaba” kelimesi tutulabilir. Bu durumda, dizi boyutu 40 olmasına rağmen,katar boyutu yalnızca 7’dir. Katarların boyutunu saptamak için, boş karakter( NULL Character ) işaretinin yani “\0” simgesinin konumuna bakılır.Her seferinde arama yapmanıza gerek kalmasın diye strlen( ) fonksiyonu geliştirilmiştir. strlen( ) kendisine argüman olarakgönderilen bir katarın boyutunu geri döndürür. Aşağıdaki gibi kullanılmaktadır:
#include<stdio.h>
#include<string.h>
int main( void )
{
printf( “Katar Uzunluğu: %d\n”, strlen(“Merhaba”) );
return 0;
}

* strcpy( ) ve strncpy( ) ile katar kopyalama

Bir katarı, bir başka katara kopyalamak için strcpy( ) fonksiyonunu kullanırız. Katarlar aynı boyutta olmakzorunda değildir. Ancak kopya olacak katar, kendisine gelecek kelimeyi alacak boyutasahip olmalıdır. Fonksiyon prototipi aşağıdaki gibidir, geriye pointer döner.
char *strcpy( char[ ], char[ ] );

strcpy( ) fonksiyonunu bir örnekle görelim:
#include<stdio.h>
#include<string.h>
int main( void )
{
char kaynak[40]=”Merhaba Dünya”;
char kopya[30] = “”;
strcpy( kopya, kaynak );
printf( “%s\n”, kopya );

return 0;
}

strncpy( ) fonksiyonu, yine kopyalamak içindir. Fakat emsalinden farklı olarak, kaç karakterin kopyalanacağı belirtilir. Protopi aşağıda verilmiştir:
char *strncpy( char[ ], char[ ], int );

Yukardaki örneği strncpy( ) fonksiyonuyla tekrar edelim:
#include<stdio.h>
#include<string.h>
int main( void )
{
char kaynak[40]=”Merhaba Dünya”;
char kopya[30] = “”;
strncpy( kopya, kaynak, 9 );
printf( “%s\n”, kopya );

return 0;
}

Yukardaki programı çalıştırırsanız, kopya isimli katara sadece 9 karakterinaktarıldığını ve ekrana yazdırılan yazının “Merhaba D” olduğunugörebilirsiniz.

* strcmp( ) ve strncmp( ) ile katar karşılaştırma

strcmp( ) fonksiyonu, kendisine verilen iki katarı birbiriyle karşılaştırır.Katarlar birbirine eşitse, geriye 0 döner. Eğer ilk katar alfabetik olarakikinciden büyükse, geriye pozitif değer döndürür. Şayet alfabetik sırada ikincikatar birinciden büyükse, geriye negatif değer dönmektedir. Bu dediklerimizi,daha iyi anlaşılması için bir tabloya dönüştürelim:

Dönen Değer Açıklama
< 0 Katar1, Katar2’den küçüktür.
0 Katar1 ve Katar2 birbirine eşittir.
> 0 Katar1, Katar2’den büyüktür.

strncmp( ) için de aynı kurallar geçerlidir. Tek fark, karşılatırılacakkarakter sayısını girmemizdir. strcmp( ) fonksiyonunda iki katar, null karakter işareti çıkana kadar karşılaştırılır. Fakat strncmp( ) fonksiyonunda, başlangıçtan itibaren kaç karakterin karşılaştırılacağına sizkarar verirsiniz.

Her iki fonksiyonu da kapsayan aşağıdaki örneği inceleyelim:
#include<stdio.h>
#include<string.h>
int main( void )
{
int sonuc;
char ilk_katar[40]=”Maymun”;
char ikinci_katar[40]=”Maytap”;
sonuc = strcmp( ilk_katar, ikinci_katar );
printf( “%d\n”, sonuc );
sonuc = strncmp( ilk_katar, ikinci_katar, 3 );
printf( “%d\n”, sonuc );

return 0;
}

İlk önce çağrılan strcmp( ), null karakterini görene kadar bütünkarakterleri karşılaştıracak ve geriye negatif bir değer döndürecektir. Çünkü”Maymum” kelimesi alfabede “Maytap” kelimesinden önce gelir;dolayısıyla küçüktür. Fakat ikinci olarak çağırdığımız strncmp( ) geriye 0 değeri verecektir. Her iki katarın ilk üç harfi aynıdır ve fonksiyondasadece ilk üç harfin karşılaştırılmasını istediğimizi belirttik. Dolayısıylakarşılaştırmanın sonucunda 0 döndürülmesi normaldir.

* strcat( ) ve strncat( ) ile katar birleştirme

strcat( ) ve strncat( ) fonksiyonları, birkatarı bir başka katarla birleştirmeye yarar. Fonksiyon adlarında bulunan cat, İngilizce bir kelime olan ve birleştirme anlamına gelen ‘concatenate’den gelmiştir. strcat( ) kendisine verilen katarları tamamen birleştirirken, strncat( ) belirli bir eleman sayısına kadar birleştirir.strcat ile ilgili basit bir örnek yapalım.
#include<stdio.h>
#include<string.h>
int main( void )
{
char ad[30], soyad[20];
char isim_soyad[50];
printf( “Ad ve soyadınızı giriniz> ” );
scanf( “%s%s”, ad, soyad );
// isim_soyad <– ad
strcat( isim_soyad, ad );
// isim_soyad <– ad + ” ”
strcat( isim_soyad, ” ” );
// isim_soyad <– ad + ” ” + soyad
strcat( isim_soyad, soyad );
printf( “Tam İsim: %s\n”, isim_soyad );
return 0;
}

Dilerseniz, strncat( ) fonksiyonunu da siz deneyebilirsiniz.

* strstr( ) fonksiyonuyla katar içi arama yapma

Bir katar içinde, bir başka katarı aradığınız durumlarda, strstr( )fonksiyonu yardımınıza yetişir. strstr( ) fonksiyonu, bir katariçinde aradığınız bir katarı bulduğu takdirde bunun bellekteki adresini geriyedöndürür. Yani dönen değer çeşidi bir pointer’dır. Eğer herhangi bir eşleşme olmazsageriye bir sonuç dönmez ve pointer null olarak kalır. Elbette insanlar içinhafıza adreslerinin veya pointer değerlerinin pek bir anlamı olmuyor. Bir katar içindearama yapıyorsanız, aradığınız yapının katarın neresinde olduğunu tespit etmek içinaşağıdaki kodu kullanabilirsiniz:
/* strstr( ) fonksiyon ornegi */
#include<stdio.h>
#include<string.h>
int main( void )
{
char adres[] = “Esentepe Caddesi Mecidiyekoy Istanbul”;
char *ptr;
// ‘adres’ katari icinde, ‘koy’ kelimesini
// ariyoruz. Bu amacla strstr( ) fonksiyonunu
// kullaniyoruz. Fonksiyon buyuk-kucuk harf
// duyarlidir. Eger birden fazla eslesme varsa,
// ilk adres degeri doner. Hic eslesme olmazsa,
// pointer degeri NULL olur.
ptr = strstr( adres, “koy” );
if( ptr != NULL )
printf( “Başlangıç notkası: %d\n”, ptr – adres );
else
printf( “Eşleşme bulunamadı.\n” );
return 0;
}

* strchr( ) ve strrchr( ) fonksiyonları

strchr( ) ve strrchr( ) fonksiyonları, tıpkı strstr( ) gibi arama için kullanılır. Ancak strstr( ) fonksiyonu katar içinde bir başka katarı arayabilirken, strchr( ) ve strrchr( ) fonksiyonları katar içinde tek bir karakter aramakiçin kullanılır. strchr( ), karakterin katar içindeki ilk konumunugösterirken; strrchr( ) fonksiyonu, ilgili karakterin son kezgeçtiği adresi verir.
#include<stdio.h>
#include<string.h>
int main( void )
{
char adres[] = “Esentepe Caddesi Mecidiyekoy Istanbul”;
char *ilk_nokta, *son_nokta;
ilk_nokta = strchr( adres, ‘e’ );
son_nokta = strrchr( adres, ‘e’ );
if( ilk_nokta != NULL ) {
printf( “Ilk gorundugu konum: %d\n”, ilk_nokta – adres );
printf( “Son gorundugu konum: %d\n”, son_nokta – adres );
}
else
printf( “Eşleşme bulunamadı.\n” );
return 0;
}

* atoi( ) ve atof( ) ile katar dönüşümü

Verilen katarı, sayıya çevirmek gerekebilir. Eğer elinizdeki metni, bir tam sayıya( int ) çevirecekseniz, atoi( ) fonksiyonunukullanmanız gerekir. Şayet dönüşüm sonunda elde etmek istediğiniz değişken tipi,virgüllü sayı ise ( float ), atof( ) fonksiyonukullanılır. Her iki fonksiyon stdlib.h kütüphanesi içindedir. Bufonksiyonları kullanırken, #include<stdlib.h> komutunu programbaşlangıcına yazmalısınız.
#include<stdio.h>
#include<stdlib.h>
int main( void )
{
char kok_iki[] = “1.414213”;
char pi[] = “3.14”;
char tam_bir_sayi[] = “156”;
char hayatin_anlami[] = “42 is the answer”;

printf( “%d\n”, atoi( tam_bir_sayi ) );
printf( “%d\n”, atoi( hayatin_anlami ) );
printf( “%f\n”, atof( kok_iki ) );
printf( “%f\n”, atof( pi ) );
return 0;
}

Her iki fonksiyonda rakam harici bir şey görene kadar çalışır. Eğer nümerikifadeler dışında bir karakter çıkarsa, fonksiyon o noktada çalışmayı keser.

main( ) Fonksiyonuna Argüman Aktarımı

İşlediğimiz bütün derslerde main( ) fonksiyonu vardı. main( ) fonksiyonuyla ilgili incelememizi de,fonksiyonlarla ilgili dokuzuncu dersimizde yapmıştık. Ancak main( )fonksiyonuna hiçbir zaman parametre aktarmadık; aksine parametre almayacağını garantilemek için sürekli olarak main( void ) şeklinde yazmıştık.Artık main( ) fonksiyonuna nasıl parametre verileceğini göreceğiz.Aşağıdaki kod, parametresi olan bir main( ) fonksiyonunu göstermektedir:
#include<stdio.h>
int main( int argc, int *arg[] )
{
int i;
for( i = 0; i < argc; i++ ) {
printf( “%d. argüman: %s\n”, i, arg[i] );
}
return 0;
}

Bu kodu yazıp, “yeni_komut.c” adıyla kaydedin. Ardından eğer Linux ve gcckullanıyrsanız, aşağıdaki komutu kullanarak kodun derlemesini yapın.
$ gcc yeni_komut.c -o yeni_komut

Yukardaki komut, “yeni_komut” adında çalıştırılabilir bir program dosyası oluşturacak. Windows ve Dev-C++ kullanıyorsanız böyle bir komuta gerek yok. Kodukaydedip, derlediğiniz zaman, çalışma klasörünüzde “yeni_komut.exe” adındabir dosya zaten oluşacaktır.

İkinci aşamada, programa parametre göndererek çalıştıracağız. Bunun için gerekLinux gerekse Windows kullanıcılarının yapacağı şey birbirine çok benziyor.Linux kullanıcıları aşağıdaki gibi bir komut girecekler:
$ ./yeni_komut Merhaba Dünya Hello World

Windows kullanıcılarınınsa, DOS komut istemini açıp, programın kayıtlı olduğuklasöre gelmeleri gerekiyor. Diyelim ki, “yeni_komut.exe””C:\Belgelerim” içinde kayıtlı… O hâlde aşağıdaki komutu giriyoruz:
C:\Belgelerim> yeni_komut Merhaba Dünya Hello World

Her iki işletim sisteminde elde edeceğiniz sonuç aynı olacaktır:
0. argüman: ./yeni_komut
1. argüman: Merhaba
2. argüman: Dünya
3. argüman: Hello
4. argüman: World

Dışardan gelen argümanla çalışan bir başka main( ) fonksiyonuoluşturalım. Toplama ve çıkartma işlemini alacağı argümanlara göre yapan birprogramı aşağıda bulabilirsiniz:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main( int argc, char *arg[] )
{
// Eger eksik arguman soz konusuysa,
// program calismamalidir.
if( argc < 4 ) {
printf( “Hata: Eksik argüman!\n”);
return;
}

float sayi_1, sayi_2;
char islem_tipi[2];
sayi_1 = atof( arg[1] );
strcpy( islem_tipi, arg[2] );
sayi_2 = atof( arg[3] );

// Verilen sembolun neye esit oldugu asagidaki
// if-else if merdiveniyle saptaniyor.
if( !strcmp( islem_tipi, “+” ) )
printf( “Toplam: %.2f\n”, sayi_1 + sayi_2 );
else if( !strcmp( islem_tipi, “-” ) )
printf( “Fark: %.2f\n”, sayi_1 – sayi_2 );
else
printf( “Hatalı işlem!\n” );
return 0;
}

Programı çalıştırmak için şu tarz bir komut verdiğimizi düşünelim:
$ ./hesapla 4 + 12

Programı bu şekilde çalıştırdığınız zaman argümanların, parametrelereatanması aşağıdaki gibi olur:

arg[ 0 ] arg[ 1 ] arg[ 2 ] arg[ 3 ]
./hesapla 4 + 12

Bütün fonksiyonlara, program içersinden argüman aktarımı yaparken;main( ) fonksiyonuna program dışından değer gönderebiliyoruz.Unix komutlarının hemen hemen hepsi bu şekildedir. DOS komutlarının birçoğu daböyle yazılmıştır. main( ) fonksiyonun parametre alıp almaması gerektiğine, ihtiyacınıza göre sizin karar vermeniz gerekir.

Örnek Sorular

Soru 1: Kendisine verilen bir katarın boyutunu bulan fonksiyonu yazınız.( Çözüm için strlen( ) fonksiyonunu kullanmayınız. )

Cevap için tıklayınız…

Soru 2: Tersinden de aynı şekilde okunabilen kelime, cümle veya mısraya ‘palindrome’ denmektedir. Adı palindrome( ) olan ve verilen katarın tersinin kendisine eşit olduğu durumda geriye 1; aksi hâlde 0 döndüren fonksiyonu yazınız.

Cevap için tıklayınız…

Soru 3: Aşağıdaki gibi çalışıp, çıktı üretebilecek “ters_cevir” programını oluşturunuz.
$ ./ters_cevir Merhaba Dunya Nasilsin?
abahreM aynuD ?nislisaN

Cevap için tıklayınız…