[]
c dilinde bir soru
girilen bir stringdeki birbirinden farklı harfleri nasıl gösterebiliriz? yani mesela ankara kelimesi girilirse a,n,k,r harflerini elde etmek istiyorum.
C'de nasıl yazılır bilmiyorum ama içiçe 2 for döngüsü ile olur sanırım. İlk harfi aldıktan sonra her harf için kendinden önce gelenler içinde kontrol edip tekrar etmiyorsa yazdırılabilir.
- onexey (06.12.14 16:27:45)
Biraz amele bir yol ile yapabilirim ben bunu. İlk önce tek elemanlı bir char değişkeni oluştururum. Adı tekrarsizlar olsun. Array'in ilk elemanından (string bir char array'idir) ilk harfi bu değişkene atarım. İkinci harfe gelip daha önceki ile kontrol ederim. Eğer ona eşit değilse, tekrarsizlar değişkenini realloc ile iki elemanlı bir array haline getirir, ikinci elemanını bu ikinci harf yaparım. Sonra üçüncüye geçerim, tekrarsizlar değişkeninde bu eleman yok ise realloc ile tekrarsizlar'ın boyutunu 3' çıkarır ve bu üçüncü harfi eklerim. Bunu da string'in sonuna gelene kadar, yani '\0'ı görene kadar yapardım.
- aychovsky (06.12.14 16:33:56)
Oldu. Program açısından mükemmel değil, hatta azıcık rezil ama iş görür.
#include <stdio.h>
#include <stdlib.h>
int main(void){
char string[] ="Ankara";
int size=1;
char *tekrarsizlar;
tekrarsizlar = (char*)malloc(1);
char *sptr;
int a, i;
int k;
sptr=string;
tekrarsizlar[0]=*sptr;
sptr++;
while (*sptr != '\0'){
a=0;
for (i=0; i<=size-1;i++){
if (*sptr==tekrarsizlar[i]){
a=1;
}
}
if (a==0){
size=size+1;
tekrarsizlar = (char*) realloc(tekrarsizlar, size);
tekrarsizlar[size-1]=*sptr;
}
sptr++;
}
size=size+1;
tekrarsizlar = (char*) realloc(tekrarsizlar, size);
tekrarsizlar[size-1]='\0';
sptr=tekrarsizlar;
while (*sptr != '\0'){
printf("%c\t", *sptr);
sptr++;
}
system("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main(void){
char string[] ="Ankara";
int size=1;
char *tekrarsizlar;
tekrarsizlar = (char*)malloc(1);
char *sptr;
int a, i;
int k;
sptr=string;
tekrarsizlar[0]=*sptr;
sptr++;
while (*sptr != '\0'){
a=0;
for (i=0; i<=size-1;i++){
if (*sptr==tekrarsizlar[i]){
a=1;
}
}
if (a==0){
size=size+1;
tekrarsizlar = (char*) realloc(tekrarsizlar, size);
tekrarsizlar[size-1]=*sptr;
}
sptr++;
}
size=size+1;
tekrarsizlar = (char*) realloc(tekrarsizlar, size);
tekrarsizlar[size-1]='\0';
sptr=tekrarsizlar;
while (*sptr != '\0'){
printf("%c\t", *sptr);
sptr++;
}
system("pause");
return 0;
}
- aychovsky (06.12.14 17:08:43 ~ 17:22:46)
@aychovsky bahsetmiş benim önerim de buna benzer, dinamik bir array veya 20 elemanlı(20'den fazla harfi olan sözcük olmaz mantığı, eğer cümle ise size'I artırırsın.) bir array'a karakterleri sırayla atarsın, atarken de eğer alfabeye göre bir sıralama algoritması kullanırsan daha performanslı olur ama diğer durumda da baştan başlayacak şekilde çıkan her harfi kontrol ettirirsin, daha önce yoksa array'e ekler var ise kontrol'ü sonlandırır sıradaki harfe geçersin.
- gezegen olan pluton (06.12.14 17:22:32)
Bir de benim yazdığım case sensitive A - a ayrımını kontrol etmiyor, ikisi farklı harfmiş gibi davranıyor. Onu da eklemek gerek de, üşendim.
- aychovsky (06.12.14 17:24:05)
hiz kazanmak icin memory' den fedakarlik etmek sorun degilse bir yontem su olabilir: Her elemani NULL olan 256 byte' lik bir array tanimlanir. Daha sonra stringin icerisinde for dongusu ile donerken her bir karakteri int' e cast edip(ascii karsiligina yani), ilk dedigim arrayin indexine bu cast ettigin karakteri koyarak NULL mi degil mi bakilir, NULL ise ekrana yazilip arr[str[i]] = 1; yapilir ve daha sonra tekrarli bir karaktere denk geldigin zaman array[str[i]] == NULL olmayacagi icin ekrana bastirmazsin. Koda dokersek de soyle olur:
#include <stdio.h>
int main(){
char *arr[256] = {NULL};
char *str = "kahramanmaras";
int i;
for(i = 0; i < str[i] != '\0'; i++){
if(arr[(int)str[i]] == NULL){
printf("%c ", str[i]);
arr[(int)(str[i])] = 1;
}
}
return 0;
}
#include <stdio.h>
int main(){
char *arr[256] = {NULL};
char *str = "kahramanmaras";
int i;
for(i = 0; i < str[i] != '\0'; i++){
if(arr[(int)str[i]] == NULL){
printf("%c ", str[i]);
arr[(int)(str[i])] = 1;
}
}
return 0;
}
- sterimar (06.12.14 17:32:09)
1