sscanf,snprintf

从一个字符串中读进与指定格式相符的数据.
例子:
#define COMPRESS_PET "%d,%d,%d,%d,%d,%d,%ld,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d"
int nID = 0;
int nRoleID = 0;
int nSpeciesID = 0;
int nGrade = 0;
int nCharacter = 0;
int nExp = 0;
time_t nBirthday = 0;
int nHp = 0;
int nGrowRate = 0;
int nHpLearn = 0;
int nAttackLearn = 0;
int nDefenseLearn = 0;
int nSuperAttackLearn = 0;
int nSuperDefenseLearn = 0;
int nSpeedLearn = 0;
int nActiveSkillOne = 0;
int nActiveSkillOneCount = 0;
int nActiveSkillTwo = 0;
int nActiveSkillTwoCount = 0;
int nActiveSkillThree = 0;
int nActiveSkillThreeCount = 0;
int nActiveSkillFour = 0;
int nActiveSkillFourCount = 0;
int nPassiveSkillOne = 0;
int nPassiveSkillTwo = 0;
int nPassiveSkillThree = 0;
int nPassiveSkillFour = 0;
int nPlace = 0;
int nMaxHp = 0;
int nAttack = 0;
int nDefense = 0;
int nSuperAttack = 0;
int nSuperDefense = 0;
int nSpeed = 0;
sscanf((*iter).c_str(),COMPRESS_PET, &nID, &nRoleID, &nSpeciesID, &nGrade,
&nCharacter, &nExp, &nBirthday, &nHp, &nGrowRate, &nHpLearn,
&nAttackLearn, &nDefenseLearn, &nSuperAttackLearn, &nSuperDefenseLearn,
&nSpeedLearn, &nActiveSkillOne, &nActiveSkillOneCount, &nActiveSkillTwo,
&nActiveSkillTwoCount, &nActiveSkillThree, &nActiveSkillThreeCount,
&nActiveSkillFour, &nActiveSkillFourCount, &nPassiveSkillOne,
&nPassiveSkillTwo, &nPassiveSkillThree, &nPassiveSkillFour, &nPlace,
&nMaxHp, &nAttack, &nDefense, &nSuperAttack, &nSuperDefense, &nSpeed);

snprintf

int snprintf(char *str, size_t size, const char *format, ...);
将可变个参数(...)按照format格式化成字符串,然后将其复制到str中
(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');
(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0')
函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。
例子:
char *pBuffer = GetSQLBuffer();
snprintf(pBuffer,GetSQLBufferSize() - 1, SQL_UPDATE_ROLE_PET, GetNum(), GetIDs().c_str(), GetDetails().c_str(),GetRoleID());
char szSQL[1024] = {0};
snprintf(szSQL, 1023, SQL_QUERY_ROLE_PET_BINARY, GetRoleID());

`snprintf` 和 `snscanf` 分别是用于字符串处理函数,在 C 语言环境中非常有用。 ### `snprintf` `snprintf` 函数主要用于将格式化后的字符串存储到缓冲区中,并提供对输出长度的控制,避免了 `printf` 类函数可能导致的缓冲溢出的风险。该函数通常用于创建字符串输出,例如日志记录、文件输出等场合。 **语法**: ```c int snprintf(char *str, size_t size, const char *format, ...); ``` - **参数**: - `str`: 指向目标字符串缓冲区的指针。 - `size`: 缓冲区的大小。 - `format`: 格式化字符串。 - `...`: 额外的参数用于格式化的字符串。 **返回值**: 返回实际写入的字符数(包括结束符 '\0'),但如果缓冲区太小则返回小于 `size` 的字符数并设置 `errno` 到 `ERANGE`。 **例子**: ```c #include <stdio.h> #include <string.h> int main() { char buffer[50]; snprintf(buffer, sizeof(buffer), "The answer is %d", 42); printf("Buffer content: %s\n", buffer); return 0; } ``` ### `snscanf` `snscanf` 是 `sscanf` 函数的一个变体,它允许读取格式化字符串而不是打印。`snscanf` 主要在需要从输入流中解析数据并将其存储到变量中时使用。它可以有效地解析复杂的输入格式并存储到预定义的变量中,适用于多种类型的输入数据。 **语法**: ```c int snscanf(const char * restrict str, const char * restrict format, ...) ; ``` - **参数**: - `str`: 包含待解析字符串的指针。 - `format`: 用于描述期望解析的格式的字符串。 - `...` : 需要解析到特定内存位置的数据项列表。 **返回值**: 返回成功匹配的格式字符串的数量(不包括终止符),如果失败则返回 `-1` 并设置 `errno`。 **例子**: ```c #include <stdio.h> #include <stdlib.h> int main() { char input[80]; double value; // Read a float from the user. if (snscanf(input, "%lf", &value) == 1) { printf("Parsed value: %.2f\n", value); } else { fprintf(stderr, "Invalid input.\n"); } return 0; } ``` **注意事项**: - 虽然 `snscanf` 可以提供更安全的输入解析方式,但是使用不当仍然可能会导致错误或安全漏洞。始终小心地处理用户输入和错误检查,以防恶意输入或异常情况。 - 使用 `snprintf` 和 `snscanf` 时,确保传给它们的参数正确无误,以避免潜在的程序错误。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值