Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

C sorulari


sigisMoNd

Öne çıkan mesajlar

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?
Link to comment
Sosyal ağlarda paylaş

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ı.
Link to comment
Sosyal ağlarda paylaş

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;
}
}
}

Link to comment
Sosyal ağlarda paylaş

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?
Link to comment
Sosyal ağlarda paylaş

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/
Link to comment
Sosyal ağlarda paylaş

:'( (: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.
Link to comment
Sosyal ağlarda paylaş

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?
Link to comment
Sosyal ağlarda paylaş

  • 3 hafta sonra ...
×
×
  • Yeni Oluştur...