[Çözüldü] Karakter dizisinden normal diziye çevirim

Başlatan tlg, 29 Ekim 2015 - 01:46:07

« önceki - sonraki »

0 Üyeler ve 2 Ziyaretçi konuyu incelemekte.

tlg

Amacım komut satırından aldığım karakteri normal diziye çevirmek, örnek vericek olursam;
#include <stdio.h>
int main (int argc, char *argv[])
{
    printf("%s", argv[1]);
    return 0;
}


./ornek Merhaba

argv[1] bana ilk girilen değerimi gösteriyor(bu örnekte "Merhaba") ve bunun en azından string olduğunu biliyorum, pointer konusunda zaten sıkıntı çekiyorum bu yüzden diziye nasıl çevireceğimi bulabilmiş değilim. Yardımcı olursanız çok sevinirim.

Amenofis

Stringler de dizidir zaten, çevirme durumu yok. Girdiğin "merhaba" harflerden oluşan bir dizi. İlk harfin adresi de argv[1]. Eğer başka kelimeler giriyorsan bunları da argv[2], argv[3] ... diye bulabilirsin.

Bu başlangıç adresini başka bir işaretçiye verebilirsin. const char *kelime = argv[1]; gibi.

Eğer istediğin modifiye edilebilir bir dizi ise stringi kopyalaman gerekir.
char kelime[20];
strcpy(kelime, argv[1]);

tlg

#2
Evet, istediğim modifiye edilebilir bir dizi. Ancak o zamanda şu problem var, bana gelecek kelimeyi bilmediğimden rastgele eleman sayısına göre dizi oluşturmak biraz gereksiz geldi.
Dinamik dizi kullanmak istedim ama ona da bir sayı vermeliyiz parametre olarak. Şöyle bir yol aklıma geldi, eleman sayısını belirleyip ona göre dizi oluşturmak istedim. Mesela


printf("%d\n", strlen(argv[1]));

dediğim zaman da, çalıştırırken "segmentation fault (core dumped)" hatası alıyorum.

Düzeltme: Gariptir ki şuan hata almıyorum düzgün bir şekilde string boyutunu verdi.

tlg

#3
Bu soruyla ilgili şöyle bir kod yazdım;

#include <stdio.h>
#include <string.h>

char replaceUnderscoreWithSpace(char []);

int
main (int argc, char *argv[])
{
  char str[strlen(argv[1])]; /* Girilen kelimenin eleman sayısı kadar dizi */
  strcpy(str, argv[1]);

  replaceUnderscoreWithSpace(str);

  printf("%s\n", str);
  return 0;
}

char
replaceUnderscoreWithSpace(char *str)
{
  int i;
  for (i=0; i < strlen(str); i++)
  {
if (str[i] == '_' && (i == 0 || i == (strlen(str) - 1)))
  ;
else if (str[i] == '_')
  str[i] = ' ';
  }
}


Değişken isimleri ve kod okunabilirliği kısmında eksikliklerim var önerisi olan, şurası şöyle olsa daha iyi olur diyen var mı? GNU C standartlarını baz alarak yazmaya çalıştım. https://developer.gnome.org/programming-guidelines/stable/c-coding-style.html.en
Önerilerinizi dinlemek istiyorum.

Bu arada program kendisine verilen karakter dizisindeki alt tireleri(baştaki ve sondaki hariç) boşluk ile değiştiriyor. Derleyip çalıştırırsak,

gcc ReplaceUnderscoreWithSpace -o a.o
./ReplaceUnderscoreWithSpace _foo_bar_baz_


Çıktı şu şekilde oluyor; _foo bar baz_

Amenofis

Verdiğin kaynak gnu c değil ama gtk kodlama stilini gösteriyor. Ben bu tür şeylere takılmak yerine kendi zevkine uymanı tavsiye ederim. Şahsen benim için kod yazmak büyük bir zevk ve herşeyi kendi zevkime göre yapmayı tercih ederim. Mesela fonksiyonun dönüş tipini yukarı satıra yazmak bence çok kötü. Ayrıca ben gerekmedikçe prototip yazmam.

#include <stdio.h>
#include <string.h>

void replaceUnderscore(char *str)
{
    int len = strlen(str) - 1;
    
    for(int i = 0; i <= len; ++i) {
        if(str[i] == '_' && i != 0 && i != len)
            str[i] = ' ';
    }
}

int main(int argc, char *argv[])
{
    char dizi[100];
    strcpy(dizi, argv[1]);
    
    replaceUnderscore(dizi);
    printf("%s\n", dizi);
    
    return 0;
}

tlg

#5
GNU C zannetmiştim ama neyse (GTK kodlama takımına girmek isterim orası ayrı :D). Kodlama dediğiniz gibi zevk işi ancak şu yönden de düşünürsek, büyük bir projeye dahil olduğunuz zaman okunabilirlik açısından belirli standartlara uymak zorunlu tutulmasa da önerilir. Yani bir yandan da aşinalık olması gerekir diye düşünüyorum.

Prototip, bu örnekte üstte yada altta olması önemli değil gibi. 20 fonksiyonlu bir program düşünürsek prototip kullanmak daha sağlıklı gibi. Kaynak kod incelendiğinde ilk olarak main fonksiyonu görünmeli bence.

Birde şu "for" kısmına takıldım. Okulda bir değişkenle belirtmek yerine, direk bir fonksiyonla belirtilmesi daha sağlıklı olur demişlerdi. "for (i = 0; i < strlen(arr); i++)" gibi. Ancak birden çok yerde kullandığım için bunu, değişkene atamak daha iyi olur gibi geliyor.

Ayrıca "if" kısmını tek satırda halletmeniz güzel olmuş. Bunu hemen ekliyorum ve gerekli düzenlemeleri yapıyorum.

Bir de ne kadar boşluk iyidir sizce girintilerde?

Tabi bunlar sizin şahsi görüşleriniz, fikirleriniz için teşekkür ederim :)

betseg

./a.o "qweqwe\_ewqewq"
yazınca _'yi kaldırmayan bişi yapmaya çalıştım ama yapamadım :P

tlg

Bu soruyu hallettim, haliyle konuyu kapatıyorum.
Bakmak isteyen olursa, www.github.com/kulac/progdil