C如何在一定长度或读取特定字符时停止扫描集

C how to make a scanset stop when at certain length or when reading specific char

我有一个由 3 部分(开始、中间、结束)组成的字符串。
中间部分封装在''中,它总是包含一个或多个字符(可能是几百个)。
如果它超过 15 个字符,我只想存储这部分的前 15 个字符。否则,我只能存储整个部分。

char result1[16], result2[16];
char *str1 = "placeholder 'this is more than 15 chars' placeholder";
char *str2 = "placeholder 'this is less' placeholder";

sscanf(str1, "%*[^']'%15[^']'%*[^']", result1);
sscanf(str2, "%*[^']'%15[^']'%*[^']", result2);

printf("|%s|", result1);
printf("|%s|", result2);

//Expected output result1: "|this is more th|"
//Expected output result2: "|this is less|"

请记住,我对一个 sscanf 来处理这两种情况很感兴趣。
上面的例子可能看起来有效,但有时在 str2 的情况下,扫描集将继续吃掉所有 15 个字符,即使它已经满足其分隔符 '.

有没有办法让扫描集仅在吃掉少于 15 个字符时才在其分隔符处停止?

考虑使用错误检查的更强大的替代方案。

char *get_middle(char *dest, size_t sz, const char *s) {
  if (dest == NULL || sz == 0) return NULL;
  char *first = strchr(s, '\''); 
  if (first == NULL) return NULL;
  first++;
  char *second = strchr(first, '\''); 
  if (second == NULL) return NULL;
  size_t len = second - first;
  if (len == 0) return NULL;
  if (len >= sz) len = sz - 1;
  dest[len] = 0; 
  return memcpy(dest, first, len);
}