int main(){
int a[10];
for(int i;i<10;i++){
a[0]=i;
printf("%d\n",a[0]);
}
a[0]++;
return 0;
}
Ben C de diziler(arrays) i anlamak için birkaç bir şey deniyordum.Bu kodda ise yapmaya çalıştığım şey 10 değer alabilecek bir int dizi oluşturdum. Daha sonra for döngüsü ile bunun içine sayıları atadım ve kodda çalıştı ama kafada bazı şeyler hala bulutlu bu kod da bir sorun var mı acaba? Böyle mi çalışmaı?
Hayır diziyi oluşturmuşsunuz ve dizinin hep ilk elemanına (sıfırıncı elemanına) atama yapmışsınız.
Ve her atamadan sonra hep sıfırıncı elemanı yazdırmışsınız. Bu durumda dizinin sadece birinci elemanına yeni değer atamış ve o yeni değeri yazdırmış olursunuz. Diğer dizi elemanları boş kalacaktır.
Kodu baştan teker teker adımlayalım.
Normalde C standardı for döngüsü içerisinde değişken tanımlamayı tavsiye etmez. C99 bu şekilde bir tanımlama kabul etmez. C11 de kabul etmez GNU 99 ve GNU 11 de kabul etmez.
C++ la karıştırılan bir durum. Konu C ise, for içinde değişken tanımlamamak faydalı olacaktır.
Burada for döngüsü içerisinde sadece sıfırıncı elemana i değerini atıyorsunuz, i her seferinde değişse de hep a array(dizi)'ın sıfırıncı elemanına bir eğer veriyor.
Burada ise hep a dizisinin sıfırıncı elemanını yazdırıyorsunuz, Biz a[1], a[2], a[3]… gibi elemanları ne değerle yüklediğinizi ne de yazdırdığınızı göremiyoruz.
Hele for döngüsü bittikten sonra;
ile ne yapmaya çalıştığınızı anlamadım.
Özetlersek;
Kafada bulutlu olması doğru çünkü kodunuz aslında doğru çalışmıyor, sadece ekrana doğru değer yazdırıyor.
Ama dizinin diğer elemanlarını yazdırabildiğinizde onların boş olduğunu dizinizin a[0] elemanında sadece son yüklenen 9 değerinin olduğunu görebilirsiniz.
Bu kod bir çok farklı yöntemle yazılabilir.
Okunaklı olması için değer yüklemek için bir for döngüsü ve yazdırmak için başka bir for döngüsü ile yazdım ikisini bir for döngüsü ile siz de kolayca gerçekleyebilirsiniz.
Verdiğim şekilde yaparsanız, aradaki hata farklarınızı da görme ihtimaliniz yüksek.
Ben standartlara sadık kalmak adına i ve j değişkenlerini for öncesinde tanımlayarak yazdım.
Siz kullandığınız, editör ve derleyicinin standartlarına göre tekrar for içinde tanımlayabilirsiniz bu seçimlik ve uyumlulukla ilgili bir durum.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int i = 0;
int j = 0;
int a[10];
for(int i;i<10;i++){
a[i]=i;
}
for(j;j<10;j++){
printf("%d\n",a[j]);
}
return 0;
}
C dilinde, stringlerden oluşan bir diziyi statik veya dinamik olarak tanımlayabilirsiniz.
Statik olarak şöyle:
#include <stdio.h>
int main() {
char* strlist[] = {"merhaba", "dunya"};
for (int i = 0; i < 2; i++) {
printf("%s\n", strlist[i]);
}
return 0;
}
Dinamik olarak şöyle:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main() {
int n; // Dizi uzunluğunu tutacak olan değişken.
printf("Length: ");
scanf("%d", &n); // Kullanıcıdan alınan sayıyı n değişkenine atayalım.
char** strlist = (char**)malloc(n * sizeof(char*)); // n uzunluğundaki dizi için hafızadan gerekli yeri ayıralım.
for (int i = 0; i < n; i++) { // Diziye eleman eklemek için n sayısına kadar bir döngü oluşturalım.
/*
Her bir stringin uzunluğunu dinamik olarak,
gereksiz hafıza kullanımına yol açmayacak şekilde hesaplayalım.
Bunun için her bir i sayısının 10'un kaçıncı kuvveti olduğu bulunur.
Örneğin 1'den 10'a kadar olan sayılar 10'un 0. kuvveti ile 1. kuvveti arasındadır.
(int)log10(i + 1) ifadesinde, 0.1, 0.2 gibi sonuçlar 1'e yuvarlanır.
C dilinde, dizinin bittiğini '\0' karakteri ile gösteriyoruz.
Dolayısıyla (int)log10(i + 1)'den dönen değerin üstüne
'\0' karakterinin de uzunluğunu eklememiz gerekir.
*/
int len = 1 + (int)log10(i + 1);
char str[len]; // String verilerinin tutulacağı değişken.
sprintf(str, "%d", i); // Değişkene i değerini karakter dizisi olarak atayalım.
/*
Her bir string için hafızada ne kadar yer ayrılması gerektiğini belirtmemiz gerekiyor.
Aksi halde yeterli hafıza tanımlamadığımız zaman programımız düzgün çalışmayacaktır.
Dizinin her bir eleman için hafızada ne kadarlık bir yer ayırmamız gerektiğini
hesaplamamız lazım.
Oluşturacağım string verisi 'item1' gibi bir yapıda olacak.
'item'; 4 karakterlik bir string verisi.
'item''in sonuna bir tane de '\0' gelmesi gerekiyordu.
O halde 'item' ifadesi için 5 karakterlik yere ihtiyacım var.
Bir de yukarda sayının uzunluğu olan len değeri vardı.
Dolayısıyla (len + 5) kadarlık bir yer ayırırsak,
strlist[i] için gereken hafızayı -ne eksik ne de fazla- tanımlamış oluruz.
*/
strlist[i] = (char*)malloc((len + 5) * sizeof(char));
strcpy(strlist[i], "item"); // strlist[i]'ye 'item' ifadesini kopyalayalım.
strcat(strlist[i], str); // str ifadesini strlist[i]'ye ekleyelim.
printf("%s\n", strlist[i]); // strlist[i] değerini ekrana yazdıralım.
}
for (int i = 0; i < n; i++) { // Her bir eleman için ayırdığımız hafızayı serbest bırakalım.
free(strlist[i]);
}
free(strlist); // Dizimiz için ayırdığımız hafızayı serbest bırakalım.
return 0;
}
hocam return 0 yazmaya bizi neden zorluyo c ? bu kod için bahsediyorum yani neden bir değer dönmesi gerekiyor ? internetten baksam direkt bulabileceğim bilgidir kesin ama sizin fikrinizi merak ediyorum.
C bizi return 0 yazmaya zorlamıyor. Eğer main fonksiyonunu int main() {} olarak kuruyorsak,
derleyici bizden int tipinde bir veri return etmemizi bekliyor. Çünkü int main() {} demek, fonksiyon int tipinde bir veri döndürecek demektir.
Değer döndürmeyen bir main fonksiyonu; void main() {} şeklinde yazılır.
Gelenek olarak 0; programın başarılı bir şekilde çalıştığı durumlarda geri döndürülür. İstenmeyen bir durumda da 1 geri döndürülür.
İsterseniz, programın istenildiği gibi çalıştığı durumda 10 sayısını da geri döndürebilirsiniz. Ama o dili konuşanlar tarafından ne anlama geldiği bilinen, standart ifadeler oluşması amacıyla böyle kararlar alınıyor.