自从我使用标准C库的字符串解析代码(sprintf,atoi等)以来已经有一段时间了。
我目前的具体需求如下:
advance_buf( const char*& buf, const char* removed_chars, int size );
它应该将buf
指针推进到空白组之外,并将删除的字符复制到removed_chars
... size
是为了保证安全。
buf
和removed_chars
的状态之前和之后的示例:
buf
:“123 456 789”,removed_chars
:(空或垃圾)。buf
:“456 789”,removed_chars
:“123”。我也对这种功能的简洁资源感兴趣。
答案 0 :(得分:1)
听起来像 strtok(),朋友们可以完成你想要的工作。
答案 1 :(得分:1)
这应该是微不足道的:
const char * advance_buf(const char *buf, char *removed_chars, size_t size)
{
/* Copy characters until whitespace found or buffer space runs out. */
while(!isspace(*buf) && --size > 0)
*removed_chars++ = *buf++;
*removed_chars = '\0';
/* Remove separating whitespace. */
while(isspace(*buf))
buf++;
return buf;
}
我稍微更改了签名,以返回更新的buf
指针。
答案 2 :(得分:1)
怎么样:
#define SPACE " \t"
const char *advance_buf(const char *buf, char *removed_chars, int size)
{
buf += sprintf(removed_chars, "%.*s", min(size - 1, strcspn(buf, SPACE)), buf);
return buf + strspn(buf, SPACE);
}
注意:如果removed_chars
填满,多余的字符 将从buf
中删除。
const char *buf = "123 456789 X"
char removed_chars[5];
// Before: buf: "123 456789 X", removed_chars: (empty).
buf = advance_buf(buf, removed_chars, sizeof (removed_chars));
// After: buf: "456789 X", removed_chars: "123".
buf = advance_buf(buf, removed_chars, sizeof (removed_chars));
// After: buf: "89 X", removed_chars: "4567".
注意2:虽然sprintf
调用是安全的,因为"%.*s"
防止缓冲区溢出,但是一些现代编译器会为任何使用sprintf()
生成警告一些公司的编码标准禁止它。如果是这样,那么替换snprintf
或sprintf_s
。
答案 3 :(得分:0)
我建议您查看strspn()
和strcspn()
函数。以下内容将告诉您在下一个空格块之前有多少个字符:
strcspn(string, " \t");
以下内容将告诉您一大块空白是多长时间:
strspn(string, " \t");
您可以使用这些数字轻松完成此任务,如果需要,可以使用线程安全。