sigisMoNd Mesaj tarihi: Ekim 26, 2009 Mesaj tarihi: Ekim 26, 2009 selamlar! C ogrenmeye yeni basladim. daha cok cok basindayim diyebilirim. bilenler yardimci olursa sevinirim. programda (adi stegit) kendi secicegim kelimeleri bir karakterle sifreleyip daha sonra da desifre etmem gerekiyor. 28 tane kelimeyi kendim belirlicem. orasi hikaye kismi benim elimde bulunan programda 3 tane kelime var sadece. yazdigim programin 2 modda calismasi gerekiyor. hangi modda calisacagina programi compile ettigim terminalden secmem lazimmis. -f find mode -h hide mode [-o<filename>] output filename terminale bunlari yazip ./stegit -h -o secret_message_within cat secret_message_within stegit -f < secret_message_within oyle calistirmam lazim. Mirage'a pmden sormustum. main metodumun -h -o gibi argumanlari da kabul etmesi gerekiyormus. main metodda bunlari nasil tanimlarim ya da main metodun kabul etmesini saglarim? programi yazdim ama duz bir sekilde calisiyor. terminalden mudahale etmeme gerek kalmiyor en basta cumleyi yazdiktan sonra. kod #include <stdio.h> #include <stdlib.h> #include <string.h> const char p1[]= { "Hello" }; const char p2[]= { "mello" }; const char p3[]= { "cello" }; const char p0 = ' '; char output[30]; int hide_string (char input[]) { if (strstr(input, p1) != NULL) { strcat(output, "a"); } if (strstr(input, p2) != NULL) { strcat(output, "b"); } if (strstr(input, p3) != NULL) { strcat(output, "c"); } printf("%s", output); } int decode_string (char input[]) { int i; for (i=0; i<sizeof(input); i++) { if (input[i] == 'a') { printf(p1); printf(" "); } else if (input[i] == 'b') { printf(p2); printf(" "); } else if (input[i] == 'c') { printf(p3); printf(" "); } } printf("nn"); } void readLine(char line[]) { char ch; int i = 0; do { ch = getchar(); line[i] = ch; ++i; } while (ch != 'n'); } int main(void) { char in[300]; printf("Input: "); readLine(in); printf("After Hide-Method: "); hide_string(in); printf("n"); printf("After Find-Method: "); decode_string(output); return EXIT_SUCCESS; } kodda sunu soyle yapsan daha iyi olur gibi tavsiyelere de acigim. bu asil soru disinda bir sorum daha var: javada stringler icin contains sayesinde ayrica metod yazilmasina gerek kalmiyordu. yukarda onun icin readLine metodunu yazdim. internetten de baktigim kadariyla bulamadim. contains'e benzer var midir C'de?
fizban Mesaj tarihi: Ekim 26, 2009 Mesaj tarihi: Ekim 26, 2009 http://publications.gbdirect.co.uk/c_book/chapter10/arguments_to_main.html
El-Barto Mesaj tarihi: Ekim 26, 2009 Mesaj tarihi: Ekim 26, 2009 Valla c'de nasıl alındığını tam hatırlamasamda benzerliklerinden dolayı java'dan söliim. main(String args[]) die yazadınmıydı programı çalışdırırken sonuna eklediin her string args'a eklenir. P.S: şimdi baktım fizbanın linki direk anlatmış zaten char* argv[] (argümanlar için string arrayi oluyo) ve int argc toplam argüman sayısı oluyo. yine dediğim gibi mainin içine koyucaksın bunları.
Bone Mesaj tarihi: Ekim 27, 2009 Mesaj tarihi: Ekim 27, 2009 C öğrenmeye yeni başlayan birisine shell programming yaptırmak, argument felan yollatmak ilginç geldi.
El-Barto Mesaj tarihi: Ekim 27, 2009 Mesaj tarihi: Ekim 27, 2009 Shell programming shellin kendisini yazmak diilmi abi, burda sadece program shellden argüman alıyo, bence gayet normal bişey öğrettikleri :D
sigisMoNd Mesaj tarihi: Ekim 27, 2009 Konuyu açan Mesaj tarihi: Ekim 27, 2009 @Bone: C ogrettikleri ilk programlama dili degil. o yuzdendir belki. @fizban: saol link icin. bir bakayim zaman bulunca.
Mirage Mesaj tarihi: Ekim 27, 2009 Mesaj tarihi: Ekim 27, 2009 Main metodunun parametrelerini istediğin gibi belirleyemezsin. Genelde main metodu parametre olarak string array'i ya da char array'i alacak şekilde de tanımlanabilir. Sonra o array'i alıp kendin parse edeceksin.
sigisMoNd Mesaj tarihi: Kasım 2, 2009 Konuyu açan Mesaj tarihi: Kasım 2, 2009 terminalden calisma modunu secebilmek icin getopt kullanilmasi gerektigini ogrendim. programin geri kalaniyla (yukardakinde degisiklikler yaptim) compile edince sorun cikmiyor. ancak ben -h modunu secsem bile geri kalanini da yapiyor. hatta sonrasinda 2 satirda Option ohne Argument hatasi geliyor. sorunun nerde oldugunu bulamadim. bir de dosyaya yazdirma olayini yapamadim henuz. gerci iki secenek sunulmus. ya sifrelendikten sonra hemen ekrana verilcek ya da cat komutuyla terminalden cagirilcak sifrelenmis hali. onu da bilen biri anlatirsa super olur. said: int main (int argc, char *argv[]) { char input[301]; int c; while ((c = getopt(argc, argv, ":hf:o:")) != EOF) { switch (c) { case 'h': scanf("%s", input); hide_modus(input); case 'f': find_modus(input); case 'o': fprintf(stderr, "Option ohne Argumentn"); break; case '?': fprintf(stderr, "ungueltiges Argumentn"); break; } } }
Mirage Mesaj tarihi: Kasım 2, 2009 Mesaj tarihi: Kasım 2, 2009 Her case'in sonuna break koyman lazım. Yoksa case'i bitirince bir sonrakinden devam eder. Dosya yazdırma konusunda bilgim yok.
El-Barto Mesaj tarihi: Kasım 2, 2009 Mesaj tarihi: Kasım 2, 2009 Tam hatırlamıyorum ama googledan fopen ve fput, fget komutlarını araştırırsan çözersin işi.
sigisMoNd Mesaj tarihi: Kasım 2, 2009 Konuyu açan Mesaj tarihi: Kasım 2, 2009 Mirage said: Her case'in sonuna break koyman lazım. Yoksa case'i bitirince bir sonrakinden devam eder. Dosya yazdırma konusunda bilgim yok. abi.. gec saatte ugrasinca gorememisim. tesekkurler. @El-Barto: tamam bir bakiyim fopen, fput ve fget e.
Penthesilea Mesaj tarihi: Kasım 2, 2009 Mesaj tarihi: Kasım 2, 2009 abi yil 2009, ben 2. gun cinnet getirir hocayi, muduru vs artik kim veriyosa isi keserdim, allah sabir versin.
sigisMoNd Mesaj tarihi: Kasım 2, 2009 Konuyu açan Mesaj tarihi: Kasım 2, 2009 az kaldi ona da. abi niye C baska dil mi yok? neyse edit3: bir daha bakiyim
sigisMoNd Mesaj tarihi: Kasım 2, 2009 Konuyu açan Mesaj tarihi: Kasım 2, 2009 28 tane if else yapmamak icin soyle yaptim: <blockquote class="ipsQuote" data-ipsquote="" data-ipsquote-contentapp="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentcommentid="" data-ipsquote-contentid="" data-ipsquote-contenttype="forums" data-ipsquote-timestamp="" data-ipsquote-userid="" data-ipsquote-username=""> <div class="ipsQuote_citation ipsQuote_open"><a href="#" data-action="toggleQuote"> </a> said: </div> <div class="ipsQuote_contents ipsClearfix" style="display: block;" animating="false">const char *woerter[] = { "Hello", "wie", "geht", "es", "dir", "Wolke", "bitte", "geben", "Sie", "drei", "der", "Himmel", "ist", "klar", "muessen", "beide", "und", "werden", "Aufgabenstellungen", "la", "bla", "hola", "Weg", "Wetter", "gut", "!", "?", "aloha"}; const char *ch[] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", ".", " "}; char hide_string (char input[]) { int i; char *pointer; for (i=0; i<sizeof(woerter); i++){ pointer = strstr(input, woerter[i]); if (pointer != NULL) { printf("%s", ch[i]); } } }</div></blockquote> kelimeleri girdikten sonra Segmentation Fault aliyorum. google dan baktim. sanirim bu javadaki IndexOutOfBoundsException gibi. ama mantiksiz geldi. indexi 0'dan baslayip kelimeler icinde ararken her seferinde strstr fonksiyonuyla girilenin icinde olup olmadigina bakiyor. varsa da ayni indexli harfi yazdiriyor. sonucta butun kelimeler icinde aramasi lazim. i in sinirindan daha kucuk bir yere kadar karsilastiriyor. woerter[] in icinde aranicagi icin onu sinir kabul etmek dogru olmaz mi? yanlis mi dusunuyorum?
Mirage Mesaj tarihi: Kasım 2, 2009 Mesaj tarihi: Kasım 2, 2009 Nihihi, C cehennemine hoş geldin. C'de parametre olarak array tanımladığın sadece adres vermiş oluyorsun ve ama array'in boyu hakkında bir bilgi vermiyorsun (daher segmentation fault ;)). Extra bir parametre olarak array boyunu da vermen lazım. Sebebi ve detaylar için şurdan array bölümüne bakarsın: http://www.cplusplus.com/doc/tutorial/arrays/
sigisMoNd Mesaj tarihi: Kasım 2, 2009 Konuyu açan Mesaj tarihi: Kasım 2, 2009 :'( (:P) dedigin hide modusta ise yaradi ancak find modusta yine segmentation fault aliyorum. <blockquote class="ipsQuote" data-ipsquote="" data-ipsquote-contentapp="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentcommentid="" data-ipsquote-contentid="" data-ipsquote-contenttype="forums" data-ipsquote-timestamp="" data-ipsquote-userid="" data-ipsquote-username=""> <div class="ipsQuote_citation ipsQuote_open"><a href="#" data-action="toggleQuote"> </a> said: </div> <div class="ipsQuote_contents ipsClearfix" style="display: block;" animating="false">int decode_string (char input[]) { int i; char *pointer; for (i=0; i<28; i++){ pointer = strstr(input, ch[ i]); if (pointer != NULL) { printf("%s ", woerter[ i]); } } }</div></blockquote> hide'dakinin tam tersini yaptim. soyle bakinca mantikli da geldi ama desifre kismi calismiyor nedense.
El-Barto Mesaj tarihi: Kasım 2, 2009 Mesaj tarihi: Kasım 2, 2009 Tam yaptığın işlemi anlamadım da sanırım hata şu, pointer'ın boyutunu başta belirledikten sonra aynı methodla büyütemezsin. "malloc" veya öyle bişey kullanman gerekebilir.
sigisMoNd Mesaj tarihi: Kasım 2, 2009 Konuyu açan Mesaj tarihi: Kasım 2, 2009 hide_string ve hide_modus metodlari ayni aslinda. 2 ayri yerde yapiyorum o yuzden bir ordan bir oburunden kopyalayinca karismis olabilir. main haric 2 tane metodum var. hide_string(hide_modus)te okunan stringi sifreliyorum indexi ayni olan harfle, decode_string(find_modus)te de bu sifrelenmis cumleyi desifre ediyorum. tabi daha hide_stringten cikan outputu decode_stringte kullanmayi basaramadim o ayri bir sorun. onun icin de sunu dusundum ama ise yaramadi: <blockquote class="ipsQuote" data-ipsquote="" data-ipsquote-contentapp="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentcommentid="" data-ipsquote-contentid="" data-ipsquote-contenttype="forums" data-ipsquote-timestamp="" data-ipsquote-userid="" data-ipsquote-username=""> <div class="ipsQuote_citation ipsQuote_open"><a href="#" data-action="toggleQuote"> </a> said: </div> <div class="ipsQuote_contents ipsClearfix" style="display: block;" animating="false"> char hidden[29]; int decode_string (char input[]) { int i; char *pointer; for (i=0; i<28; i++){ pointer = strstr(input, ch[ i]); if (pointer != NULL) { strncmp(hidden, ch[ i]); //printf("%s ", woerter[ i]); } } }</div></blockquote> main methodda bunu cagirdiktan sonra hidden stringini decode_string(hidden); metoduyla cagirmayi denedim ama hata aldim. once su decode_string methodunun duzgun calismasi lazim. yukardaki hatayla ilgili olarak da: 2 pointer da zaten farkli metodlar icinde tanimli. ayni metodla degisiklige ugratmiyorum bildigim kadariyla? bu sekilde yanlissa siniri ayri bir parameterle belirledikten sonra hide_stringte de ayni hatayi vermesi gerekmez miydi?
sigisMoNd Mesaj tarihi: Kasım 2, 2009 Konuyu açan Mesaj tarihi: Kasım 2, 2009 strncmp yanlis fonksiyonmus strcat kullaninca hata almadim nihaha ama decode_string hala calismiyor //_-
sigisMoNd Mesaj tarihi: Kasım 2, 2009 Konuyu açan Mesaj tarihi: Kasım 2, 2009 tamam buraya kopyalamadan kendim yazmistim char olucak. heyecanlandim:P duzeltiyim
sigisMoNd Mesaj tarihi: Kasım 21, 2009 Konuyu açan Mesaj tarihi: Kasım 21, 2009 C'de const ve volatile tiplerinin farki nedir? googleladim ama farkli gorusler var. bazilari tam tersi olarak tanimlamis bazilari da benzer demis. basit birer ornekle aciklayabilicek olan var mi? ne olunca hangisini secmeliyiz mesela?
nameless Mesaj tarihi: Kasım 21, 2009 Mesaj tarihi: Kasım 21, 2009 const, değişkenin değerinin değişmesini engellemek için kullanılan bir keyword. hatırladığım kadarıyla volatile da uygulama dışında değiştirilebilecek değişken tanımlamak içindi.
Öne çıkan mesajlar