C'de string içerisinde sayı ve karakter çekmek?

Başlatan Mucit23, 22 Ekim 2014, 13:22:45

Mucit23

#30
Selamlar

Bu konuda benzer bir sorunum var.
Aşağıdaki gibi bir dizim var.
char text[265]="1.Deger|607|349|473|758|130|872|744|278|323|109|540|665|492|242|387|803|727|529|340|712|303|469|009|857|760|033|699|378|116|835|097|326|212|667|710|333|379|649|279|021|667|272|793|036|785|245|128|391|294|157|701|353|808|244|568|590|624|296|030|103|322|466|549|224#";

Elimde bu şekilde stringler bulunmakta ve '|' karakterleri arasında hedefimde olan değerler var. Toplam 64 adet bu şekilde 3 elemanlı sayı bulunuyor. Ben bu sayıları string içerisinden çekmeye çalışıyorum. İki sayı arasında '|' karakteri ile ayrac var. Dizi sonunda da '#' var

Birazcık uğraştım ama STRTOK fonksiyonu ile yapamadım. İşimi görmeyecek gibi. Bende farklı bir yöntemle yaptım

int main()
{
	char text[264]="00:01|607|349|473|758|130|872|744|278|323|109|540|665|492|242|387|803|727|529|340|712|303|469|009|857|760|033|699|378|116|835|097|326|212|667|710|333|379|649|279|021|667|272|793|036|785|245|128|391|294|157|701|353|808|244|568|590|624|296|030|103|322|466|549|224#";
    int i=0;
    char data=0, substring[3];
    int count=0;
    int parseval[65],parse_index=0;
    
    for(i=0;i<262;i++)
    {
    	data=text[i];
    	if(data=='|' || data=='#')
		{
			if(data=='|')count=3;
	
			if(parse_index>0)
			{
			   parseval[parse_index-1]=atoi(substring);
			   printf("%03d\n\r",parseval[parse_index-1]);
			}
			
			parse_index++;
     	}
		
		switch(count)
		{
			case 3:count--;break;  // Bu karakteri boş geçiyoruz. 
			case 2:substring[0]=data;count--;break;
			case 1:substring[1]=data;count--;break;
			case 0:substring[2]=data;break;			
		}
	}
	
	getch();
}

Çalışıyor. Ama pek aklıma yatmadı. Kulağı tersten tutma gibi birşey oldu. Daha efektif bir çözüm arıyorum. Bunu daha etkin bir şekilde nasıl yaparım?

DevC de denedim çalışıyor.

XX_CİHAN_XX

void getNumber(char indis, char* result, char* source)
{
	char c;
	for(c=0; source[c]!='#'; c++)
	{
		if(source[c]=='|')
		{
			if(--indis==0)
			{
				result[0] = source[c+1];
				result[1] = source[c+2];
				result[2] = source[c+3];
				result[3] = 0;
				break;
			}
		}
	}
}

int main(int argc, char *argv[]) 
{
	
	char text[265]="1.Deger|607|349|473|758|130|872|744|278|323|109|540|665|492|242|387|803|727|529|340|712|303|469|009|857|760|033|699|378|116|835|097|326|212|667|710|333|379|649|279|021|667|272|793|036|785|245|128|391|294|157|701|353|808|244|568|590|624|296|030|103|322|466|549|224#";
	char res[4];	

	getNumber(17, res, text);
	printf(res);
	
	return 0;
}


void getNumber(char indis, char* result, char* source)
bu fonksiyon ile istediğin indisteki sayıyı alabilirsin devc++ da çalışıyor.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

vitruvius

strtok ile de olur.

Yapmak istediğiniz bu değil mi?

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

int main ()
{
  char text[265]="1.Deger|607|349|473|758|130|872|744|278|323|109|540|665|492|242|387|803|727|529|340|712|303|469|009|857|760|033|699|378|116|835|097|326|212|667|710|333|379|649|279|021|667|272|793|036|785|245|128|391|294|157|701|353|808|244|568|590|624|296|030|103|322|466|549|224#";
  char *spText;
  spText = strtok (text,"|#");
  while (spText != NULL)
  {
    printf ("%s\n",spText);
    spText = strtok (NULL, "|#");
  }
  
  return 0;
}