On Tue, Aug 13, 2002 at 01:52:15PM +0200, Peter d wrote:
>Hi!
>i used this snippet, don't remember who wrote it..
>it only shows one player.. i want it to show all stored in pfile..
>
>ACMD(do_players)
>{
> char buf[MAX_INPUT_LENGTH];
> int i, count = 0;
> *buf = 0;
>
> for (i = 0; i < top_of_p_table; i++) {
> sprintf(buf, "%s %-20.20s", buf, (player_table + i)->name);
> count++;
> if (count == 3) {
> count = 0;
> strcat(buf, "\r\n");
> }
> }
> page_string(ch->desc, buf, 1);
>}
First off, there's some BIG problems with this regarding buffer
overflows and that sprintf(buf, "%s ...", buf)
Secondly, I'm guessing that since it just prints 1 player, that you have
2 players in your player_table.
It should be "<= top_of_p_table".
And for completeness sake, here's my do_players. It's got some ugly
math for the buffer size but for some reason I like it this way more
than pre-allocating static buffers everywhere. And it allows a little
padding in case something is a bit too large.
ACMD(do_players)
{
char *buf = NULL;
int i, count = 0;
buf = (char *)malloc((top_of_p_table * 26) + (top_of_p_table / 3) * 2 + 25);
for (i = 0; i <= top_of_p_table; i++) {
count += sprintf(buf + count, "%-20.20s %2d%s",
CAP((player_table + i)->name), (player_table + i)->level, ((i+1)%3)?" ":"\r\n");
}
sprintf(buf + count, "\r\n%4d players listed.\r\n", i+1);
page_string(ch->desc, buf, 1);
free(buf);
}
--
+---------------------------------------------------------------+
| FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
| Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
| Newbie List: http://groups.yahoo.com/group/circle-newbies/ |
+---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 06/25/03 PDT