sscanf
是这样工作的:sscanf是否有指向输入字符串而不是缓冲区的指针?
int main(const int argc, const char *argv[]) {
char buf1[1024] = {0};
char buf2[1024] = {0};
char buf3[1024] = {0};
char *str = "abc, 123; xyz";
sscanf(str, "%[^,], %[^;]; %s", buf1, buf2, buf3);
printf("'%s' '%s' '%s'", buf1, buf2, buf3); // Prints: "'abc' '123' 'xyz'"
return 0;
}
我想知道是否有不需要复制的str
内容到缓冲区(buf1, buf2, buf3
),也没有分配任何新的记忆功能。相反,它只会将指针(ptr1, ptr2, ptr3
)设置为指向str
中的匹配部分,并且在匹配之后将null结束。
int main(const int argc, const char *argv[]) {
char *ptr1 = NULL;
char *ptr2 = NULL;
char *ptr3 = NULL;
char *str = "abc, 123; xyz";
//
// str = "abc, 123; xyz\0"
//
_sscanf(str, "%[^,], %[^;]; %s", &ptr1, &ptr2, &ptr3);
//
// str = "abc\0 123\0 xyz\0"
// ^ ^ ^
// ptr1 ptr2 ptr3
//
printf("'%s' '%s' '%s'", ptr1, ptr2, ptr3); // Prints: "'abc' '123' 'xyz'"
return 0;
}
我知道有作为strtok_r
功能,以及regex.h
库,也可以使用,但我认为这将是在输入字符串可以被修改的情况下更方便。
的问题是,'sscanf'解析的输入不能始终* *是空终止的! 'regex.h'返回子组匹配的*范围*,这是可行的。 –
你的问题是一个废话,就好像你null终止原始字符串中间的某个地方一样,你将永远不会再是同一个字符串str,因为即使你移动了其余的字符,如果正确的str的大小增加和最有可能的重新分配将需要 –
请注意,我在某些情况下说。在某些情况下,我不关心输入字符串是否被修改。 –