I could tell you what's wrong, but if you don't already know what
the problem is, I predict you'll have many similar problems in the future.
To find out how sprintf works, find *any* book on C and read the
section on printf (sprintf is just a special version of printf).
If you don't have a C book, and don't want to buy one, I'm sure there
are many excellent web pages on printf as well.
Dennis
On Mon, 13 Jan 2003, Cameron Thompson wrote:
> *
> * New 'who' command originally by Alander of Rivers of Mud.
> */
> void do_who (CHAR_DATA * ch, char *argument)
> {
> char buf[MAX_STRING_LENGTH];
> char buf2[MAX_STRING_LENGTH];
> BUFFER *output;
> DESCRIPTOR_DATA *d;
> int iClass;
> int iRace;
> int iClan;
> int iLevelLower;
> int iLevelUpper;
> int nNumber;
> int nMatch;
> bool rgfClass[MAX_CLASS];
> bool rgfRace[MAX_PC_RACE];
> bool rgfClan[MAX_CLAN];
> bool fClassRestrict = FALSE;
> bool fClanRestrict = FALSE;
> bool fClan = FALSE;
> bool fRaceRestrict = FALSE;
> bool fImmortalOnly = FALSE;
>
> /*
> * Set default arguments.
> */
> iLevelLower = 0;
> iLevelUpper = MAX_LEVEL;
> for (iClass = 0; iClass < MAX_CLASS; iClass++)
> rgfClass[iClass] = FALSE;
> for (iRace = 0; iRace < MAX_PC_RACE; iRace++)
> rgfRace[iRace] = FALSE;
> for (iClan = 0; iClan < MAX_CLAN; iClan++)
> rgfClan[iClan] = FALSE;
>
> /*
> * Parse arguments.
> */
> nNumber = 0;
> for (;;)
> {
> char arg[MAX_STRING_LENGTH];
>
> argument = one_argument (argument, arg);
> if (arg[0] == '\0')
> break;
>
> if (is_number (arg))
> {
> switch (++nNumber)
> {
> case 1:
> iLevelLower = atoi (arg);
> break;
> case 2:
> iLevelUpper = atoi (arg);
> break;
> default:
> send_to_char ("Only two level numbers
> allowed.\n\r", ch);
> return;
> }
> }
> else
> {
>
> /*
> * Look for classes to turn on.
> */
> if (!str_prefix (arg, "immortals"))
> {
> fImmortalOnly = TRUE;
> }
> else
> {
> iClass = class_lookup (arg);
> if (iClass == -1)
> {
> iRace = race_lookup (arg);
>
> if (iRace == 0 || iRace >= MAX_PC_RACE)
> {
> if (!str_prefix (arg, "clan"))
> fClan = TRUE;
> else
> {
> iClan = clan_lookup (arg);
> if (iClan)
> {
> fClanRestrict = TRUE;
> rgfClan[iClan] = TRUE;
> }
> else
> {
> send_to_char
> ("That's not a valid race, class,
> or clan.\n\r",
> ch);
> return;
> }
> }
> }
> else
> {
> fRaceRestrict = TRUE;
> rgfRace[iRace] = TRUE;
> }
> }
> else
> {
> fClassRestrict = TRUE;
> rgfClass[iClass] = TRUE;
> }
> }
> }
> }
>
> /*
> * Now show matching chars.
> */
> nMatch = 0;
> buf[0] = '\0';
> output = new_buf ();
> for (d = descriptor_list; d != NULL; d = d->next)
> {
> CHAR_DATA *wch;
>
>
> /*
> * Check for match against restrictions.
> * Don't use trust as that exposes trusted mortals.
> */
> if (d->connected != CON_PLAYING || !can_see (ch, d->character))
> continue;
>
> wch = (d->original != NULL) ? d->original : d->character;
>
> if (!can_see (ch, wch))
> continue;
>
> if (wch->level < iLevelLower
> || wch->level > iLevelUpper
> || (fImmortalOnly && wch->level < LEVEL_IMMORTAL)
> || (fClassRestrict && !rgfClass[wch->class])
> || (fRaceRestrict && !rgfRace[wch->race])
> || (fClan && !is_clan (wch))
> || (fClanRestrict && !rgfClan[wch->clan]))
> continue;
>
> nMatch++;
>
>
> /*
> * Format it up.
> */
> sprintf (buf, "[%2d %6s %s] %s%s%s%s%s%s%s%s\n\r",
> wch->level,
> wch->race < MAX_PC_RACE ?
> pc_race_table[wch->race].who_name
> : " ",
> wch->incog_level >= LEVEL_HERO ? "(Incog) " : "",
> wch->invis_level >= LEVEL_HERO ? "(Wizi) " : "",
> clan_table[wch->clan].who_name,
> IS_SET (wch->comm, COMM_AFK) ? "[AFK] " : "",
> IS_SET (wch->act, PLR_KILLER) ? "(KILLER) " : "",
> IS_SET (wch->act, PLR_THIEF) ? "(THIEF) " : "",
> wch->name, IS_NPC (wch) ? "" : wch->pcdata->title);
> add_buf (output, buf);
> }
>
> sprintf (buf2, "\n\rPlayers found: %d\n\r", nMatch);
> add_buf (output, buf2);
> page_to_char (buf_string (output), ch);
> free_buf (output);
> return;
> }
>
>
> Now I feel like a fool.