SA-MP Forums Archive
sscanf and floats - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: SA-MP Scripting and Plugins (https://sampforum.blast.hk/forumdisplay.php?fid=8)
+--- Forum: Scripting Help (https://sampforum.blast.hk/forumdisplay.php?fid=12)
+---- Forum: Help Archive (https://sampforum.blast.hk/forumdisplay.php?fid=89)
+---- Thread: sscanf and floats (/showthread.php?tid=84621)



sscanf and floats - mprofitt - 02.07.2009

I can not seem to get sscanf to split a string with floats. I works fine with the integers and strings. Once I hit a float, I get all zeros...

Код:
		format(query,sizeof(query),"SELECT * FROM `Building`");
		samp_mysql_query(query);
		samp_mysql_store_result();
		while(samp_mysql_fetch_row(string)) {
			printf("%s",string);
			if(sscanf(string, "p|issfffiiiffffifii",
				Building[i][Num],
				Building[i][Name],
				Building[i][BuildingName],
				Building[i][EnterX],
				Building[i][EnterY],
				Building[i][EnterZ],
				Building[i][EntranceFee],
				Building[i][EnterWorld],
				Building[i][EnterInterior],
				Building[i][EnterAngle],
				Building[i][ExitX],
				Building[i][ExitY],
				Building[i][ExitZ],
				Building[i][ExitInterior],
				Building[i][ExitAngle],
				Building[i][Locked],
				Building[i][PickupID])) print("/ Error / LoadBuildings");
	
			printf("%i%s%s%f%f%f%i%i%i%f%f%f%f%i%f%i%i",Building[i][Num],Building[i][Name],Building[i][BuildingName],Building[i][EnterX],Building[i][EnterY],Building[i][EnterZ],Building[i][EntranceFee],Building[i][EnterWorld],Building[i][EnterInterior],Building[i][EnterAngle],Building[i][ExitX],Building[i][ExitY],Building[i][ExitZ],Building[i][ExitInterior],Building[i][ExitAngle],Building[i][Locked],Building[i][PickupID]);
			Building[i][PickupID] = CreateStreamPickup(1239, 1, Building[i][EnterX], Building[i][EnterY], Building[i][EnterZ],PICKUP_RANGE); //Storing the PickupID in the PickupID variable.
			printf("[Building System:] Building Name: %s - Loaded. (%d)",Building[i][Name],i);
			i++;
		}



Re: sscanf and floats - Grim_ - 02.07.2009

pawn Код:
//What is this?
if(sscanf(string, "p|issfffiiiffffifii",
Shoudn't that be this
pawn Код:
if(sscanf(string, "p|%i%s%s%f%f%f%i%i%i%i%f%f%f%f%i%f%i%i",



Re: sscanf and floats - Vince - 02.07.2009

No, it doesn't matter if you use i or %i in sscanf (same with SetTimerEx). The only thing I don't understand is what that p| is doing there.


Re: sscanf and floats - Grim_ - 02.07.2009

Quote:
Originally Posted by Vince
No, it doesn't matter if you use i or %i in sscanf (same with SetTimerEx). The only thing I don't understand is what that p| is doing there.
Oh he's using sscanf, never noticed xD

Anyways, which gamemode are you using?


Re: sscanf and floats - mprofitt - 02.07.2009

Quote:
Originally Posted by Vince
No, it doesn't matter if you use i or %i in sscanf (same with SetTimerEx). The only thing I don't understand is what that p| is doing there.
The p| specifies the delimiter...

Код:
if(sscanf(string, "p|issfffiiiffffifii",
should split 23|string|string|34.34|12.111|....etc....

but once I hit a float, I get zeros.


Re: sscanf and floats - mprofitt - 02.07.2009

Quote:
Originally Posted by mprofitt
I can not seem to get sscanf to split a string with floats. I works fine with the integers and strings. Once I hit a float, I get all zeros...

Код:
		format(query,sizeof(query),"SELECT * FROM `Building`");
		samp_mysql_query(query);
		samp_mysql_store_result();
		while(samp_mysql_fetch_row(string)) {
			printf("%s",string);
			if(sscanf(string, "p|issfffiiiffffifii",
				Building[i][Num],
				Building[i][Name],
				Building[i][BuildingName],
				Building[i][EnterX],
				Building[i][EnterY],
				Building[i][EnterZ],
				Building[i][EntranceFee],
				Building[i][EnterWorld],
				Building[i][EnterInterior],
				Building[i][EnterAngle],
				Building[i][ExitX],
				Building[i][ExitY],
				Building[i][ExitZ],
				Building[i][ExitInterior],
				Building[i][ExitAngle],
				Building[i][Locked],
				Building[i][PickupID])) print("/ Error / LoadBuildings");
	
			printf("%i%s%s%f%f%f%i%i%i%f%f%f%f%i%f%i%i",Building[i][Num],Building[i][Name],Building[i][BuildingName],Building[i][EnterX],Building[i][EnterY],Building[i][EnterZ],Building[i][EntranceFee],Building[i][EnterWorld],Building[i][EnterInterior],Building[i][EnterAngle],Building[i][ExitX],Building[i][ExitY],Building[i][ExitZ],Building[i][ExitInterior],Building[i][ExitAngle],Building[i][Locked],Building[i][PickupID]);
			Building[i][PickupID] = CreateStreamPickup(1239, 1, Building[i][EnterX], Building[i][EnterY], Building[i][EnterZ],PICKUP_RANGE); //Storing the PickupID in the PickupID variable.
			printf("[Building System:] Building Name: %s - Loaded. (%d)",Building[i][Name],i);
			i++;
		}
Using sscanf...
This code provides different results than....

Код:
{
	new string[128] = "test1|~w~te~n~st2|-1234.123456789|1234.123456789|44|55";
	new s1[10],s2[10],Float:f1,Float:f2,i1,i2;
	
	print("OnGameModeInit\n");
	
	sscanf(string, "p|ssffii",
		s1,
		s2,
		f1,
		f2,
		i1,
		i2);
	printf("s1=%s, s2=%s, f1=%f, f2=%f, i1=%i, i2=%i",s1,s2,f1,f2,i1,i2);
	return 1;
}
this code....

Код:
{
	new string[128] = "test1|test2|-1234.123456789|1234.123456789|44|55";
	new s1[10],s2[10],Float:f1,Float:f2,i1,i2;
	
	print("OnGameModeInit\n");
	
	sscanf(string, "p|ssffii",
		s1,
		s2,
		f1,
		f2,
		i1,
		i2);
	printf("s1=%s, s2=%s, f1=%f, f2=%f, i1=%i, i2=%i",s1,s2,f1,f2,i1,i2);
	return 1;
}
The '~' in the middle of the string affects sscanf....


Re: sscanf and floats - yezizhu - 02.07.2009

pawn Код:
case 'f':{

  new
    changestr[16],
    changepos = 0,
    strpos = stringPos;   while(changepos < 16 && string[strpos] && string[strpos] != delim){
    changestr[changepos++] = string[strpos++];
  }
  changestr[changepos] = '\0';
  setarg(paramPos,0,_:floatstr(changestr));
}
Edit part of sscanf to this code.
Some strange problems in "case 'f':", it doesn't format string to float normally sometime.


Re: sscanf and floats - mprofitt - 06.07.2009

Quote:
Originally Posted by yezizhu
pawn Код:
case 'f':{

  new
    changestr[16],
    changepos = 0,
    strpos = stringPos;  while(changepos < 16 && string[strpos] && string[strpos] != delim){
    changestr[changepos++] = string[strpos++];
  }
  changestr[changepos] = '\0';
  setarg(paramPos,0,_:floatstr(changestr));
}
Edit part of sscanf to this code.
Some strange problems in "case 'f':", it doesn't format string to float normally sometime.
Respect ++

Thank You!




Re: sscanf and floats - Sir_Brock - 11.08.2009

Big thanks to you yezizhu, I was having the same problem until I found this thread (so in a way, thanks mprofitt for having the same problem as me :P)


Re: sscanf and floats - Cezar - 18.11.2009

Hy! Yes I know it's an old old topic but I have a question regarding this and I don't think it requires a new topic:

Since yezizhu's fix works, shouldn't it be added to the sscanf code on the wiki? If no then why not?