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

elimde şöyle bir string var ve c'de işlem yaptırmam lazım


fizban

Öne çıkan mesajlar

A:16-34,37-67,69-125,127-130,132-204;B:501-624,627-638

altalta bunun gibi 50 tane satır var tabi, zaten böyle de değildi de aslında biraz revize edip bu hale getirdim.

strtok falan gibi string işlemlerini sevmiyor ve beceremiyorum, istediğim şey şu şekilde bir çıktım olsun (variable lara koyiyim yani)

A 16 34
A 37 67
A 69 125
A 127 130
A 132 204
B 501 624
B 627 638

nasıl yaparım sizce ?
Link to comment
Sosyal ağlarda paylaş

C'yi pek hatirlamiyorum o yuzden ancak mantik olarak anlatabilecgim;

Regular expression ile kasmak istemeyecegimden string'i once ";"e gore parse edip bir diziye atarim. Sonra dongu ile her dizi elemaninin ilk ":" e kadar olan kismini alip, geri kalanini tekrar "," ile parse ederim ve alt diziler olusturum. Sonra canim nasil istiyorsa dizerim.

Biraz daha optimize etmek mumkun tabi.
Link to comment
Sosyal ağlarda paylaş

pseudo olarak seyedeyim, istemesen de strtok kullanmalisin =)

simdi once ;'den ayiracaksin. eline bir array gececek, array1
A:16-34,37-67,69-125,127-130,132-204

ve
B:501-624,627-638

seklinde giden.

sonra bir donguye alacaksin array1'i. bu donguye loop1 diyelim. bir strtok ile harf ve rakamlari ayiracaksin. bu sefer dongu icindeki alt arrayin (array2)
A

ve
16-34,37-67,69-125,127-130,132-204

olacak.

arrayin ikinci bolumunu (array2[1]), strtok ile virgullere gore ayiracaksin. bu array'e de array3 diyelim.
16-34

37-67

69-125

gibi

array3'u yine bir loop'a alacaksin, loop2 diyelim. her instance icin array2[0] ve array3[i]'yi yazdiracaksin.
A 16-34 

eger -'ler olmasin istiyorsan array3[i]'yi strtok yapip array2[0] array3[i][0] array3[i][1] olarak yazdiracaksin.
A 16 34 
Link to comment
Sosyal ağlarda paylaş

tunca said:

while(fscanf (dosya, "%c", array[i][k] != EOF))
{
while ( fscanf (dosya, "%c", array[i][k] != "," || ";"))
i++;
k++;
i=0;
}


böle bişi düşündüm ama olur mu emin deilim :P


filedan alıyormuş gibi düşündüm tabi stringden demişsin o zaman


while(length < lengths))
{
while ( string[i] != "," || ";"))
{ string2[i][k] = string[length];
i++;
length++;
}
length++;
k++;
i=0;

}
Link to comment
Sosyal ağlarda paylaş

tuncanın dediği yöntemle altından kalkamayacağımdan strtok a döndüm yine mum un köpeği olup, yalnız şöyle bir durum var;

dikkat kod var


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

int main () {
FILE *input, *output;
char line[256], line2[256], *modline, *modlinebkp;
char **array, ***array2;
char *pch, chid, *pch2, cset[] = "direction";
int start,end, i, j, k, pno, chnum, partnum;

input = fopen("1avw2","r");

chnum=2;
array=(char**)malloc(chnum*sizeof(char*));
array2=(char***)malloc(chnum*sizeof(char**));
for (i=0;i<chnum;i++)
array2[i]=(char**)malloc(50*sizeof(char*));

// read the first 2 lines
fgets(line,256,input);
fgets(line,256,input);
//printf("%s",line);
partnum=atoi(&line[19]);

for (i=0;i<partnum;i++) {
//printf("nnn");
fgets(line,256,input);
pch=strstr(line," ");
modline=calloc((pch-line-5),sizeof(char));
memcpy(modline,line+7,pch-line-5);
//puts(modline);
pno=atoi(&line[5]);
//printf("part no of line %dn",pno);

pch = strtok (modline, ";");
j=0;
while (pch != NULL)
{
array[j]=calloc((pch-modline),sizeof(char));
strcpy(array[j],pch);
printf ("satir no %d parca no %d ::: %sn",i,j,array[j]);
pch = strtok (NULL, ";");
j++;
}
for (k=0;k<j;k++) {
chid=array[k][0];
printf("nn%cn%s",chid,array[k]);
////////////HATA
strcpy(line2,array[k]);

pch = strtok (line2, ",");
while (pch != NULL) {
pch2=strtok(pch,"-");
start=atoi(pch2);
end=atoi(NULL);
}

printf("%d %c %d %dn",i,chid,start,end);

}
}



return 0;
}




bu kod en son şu ////////////HATA
şeklidne işaretlediğim kısımda segmentation fault veriyor.
Link to comment
Sosyal ağlarda paylaş

basit olarak strtok olmaksızın açıklayayım;

Bütün stringi char array'e oku
0. indexden sonuncu indexe kadar dön
her bir indexi special karakter ile karşılaştır
special karakter varsa değiştir ve ekrana bas
yoksa harfi ekrana bas
döngüyü bitir
programdan çık
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...