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的大小增加和最有可能的重新分配將需要 –
請注意,我在某些情況下說。在某些情況下,我不關心輸入字符串是否被修改。 –