PDA

Tam Sürümünü Görmek İçin : karakter stringi


elmasekeri3000
15/10/2007, 20:04
struct competitors{
int degree;
int id;
char name[30];
char surname[30];
char branch[30];
};
yapıyı böyle tanımladım

char* sub tanımladım
sub1 = strtok( NULL, "\t" );
strcpy(compet[j].name , sub); yaptım hata aldım.

struct competitors{
int degree;
int id;
char *name;
char *surname;
char *branch;
};
struct competitors[1000];

bu sefer de böyle tanımlayıp, char *sub tanımladım.
compet[j].name = malloc(strlen(sub1));
for(in = 0; in < strlen(sub); in++)
compet[j].name[in] = sub1[in];

yaptım yine hata aldım,ne yapacağımı bilmiyorum.Yardım eder misiniz


furkans
15/10/2007, 21:00
struct competitors{
int degree;
int id;
char name[30];
char surname[30];
char branch[30];
};

Bunda bi hata yok...

char *sub yaptın tmm ama sub1 ne demek? ayrı bi değişken bu!

ayrıca compet[j] nerde ki?

struct competitors compet[20];

diye bişey yazsan hemen yapının altında tmm doğru olur.Ancak bu seferde j değerinin ne olduğu belli değil!

Eğer kodunu buraya yazarsan aynen hata aldığın şekliyle düzeltme yapmaya çalışırım..

İyi çalışmalar...

acehreli
15/10/2007, 21:10
furkans'in soylediklerin ek olarak ben de strtok'un nasil kullanildigini gosteren bir ornek yazdim. Yanlislarini bununla karsilastirarak bulabilirsin:


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

/*
* Bu yapi tek bir yarismaciyi (competitor) tanimladigi icin, ismi cogul
* olmamali.
*/
typedef struct {
int degree;
int id;

/* Bu 30'lar herhalde bazen durumda fazla kucuk kalacaklardir. O yuzden
* bunlari malloc, strdup, veya baska bir yolla ayirman gerekir. */
char name[30];
char surname[30];
char branch[30];
} competitor;

const int kayit_hatasi = -1;

/* Hem bosluk karakteri hem de tab ayrac olarak kabul ediliyor olsun */
const char * ayraclar = " \t";

int competitor_kur(competitor * yarismaci, char * kayit)
{
char * parca = NULL;

/* Bunlarin kurulumlarini bosverdim */
yarismaci->degree = 0;
yarismaci->id = 0;

/* strtok ilk cagrildiginda hangi dizgiden (kayit) okundugu
* belirtilmelidir */
parca = strtok(kayit, ayraclar);
if (!parca) {
return kayit_hatasi;
}
strcpy(yarismaci->name, parca);

/* Ayni dizgiye devam etmek icin 'strtok'a NULL gonderilir */
parca = strtok(NULL, ayraclar);
if (!parca) {
return kayit_hatasi;
}
strcpy(yarismaci->surname, parca);

/* Ayni kod blogunu cok fazla tekrarlamis olduk; aslinda bunlari bir
* isleve tasimak cok daha yararli olur. */
parca = strtok(NULL, ayraclar);
if (!parca) {
return kayit_hatasi;
}
strcpy(yarismaci->branch, parca);

return 0;
}

void competitor_yazdir(const competitor * yarismaci)
{
printf("Ad: %s, Soyad: %s, Bolum: %s\n",
yarismaci->name,
yarismaci->surname,
yarismaci->branch);
}

int main()
{
competitor yarismaci;
int hata = 0;
char giris[] = "Ali Karaali\tAscilik";

hata = competitor_kur(&yarismaci, giris);

if (hata) {
fprintf(stderr, "Okuma hatasi\n");
return 1;
}

competitor_yazdir(&yarismaci);

return 0;
}


Ali

elmasekeri3000
16/10/2007, 01:43
acehreli teşekkür ederim.
buna bakıp düzeltmeye çalışıcam ,bu ödev olduğu için açık kod veremiyorum zaten.
İyi çalışmalar...

elmasekeri3000
16/10/2007, 13:39
işe yaradı,demek ufak hataları küçümsememek gerek,bütün programa mal olabiliyor
Teşekkürler...
Umarım,ben de sizlere yardımcı olabiilirim.

quasimodo
16/10/2007, 15:42
strdup() standart bir fonksiyon degil dimi ?

acehreli
16/10/2007, 17:32
Simdi bakana kadar strdup'u standart saniyordum ama degilmis. man belgesine bakilirsa en azindan sunlara dahilmis: SVr4, 4.3BSD, POSIX.1-2001.

Ali