使用sscanf在C中获取方括号内的值

k2fxgqgv  于 2022-12-17  发布在  其他
关注(0)|答案(1)|浏览(235)

此函数从以方括号开头和结尾的输入消息中提取包含的消息,并将其插入out。
因此,如果输入= [消息],则输出=消息

int stringInsideSquareBracket(const char *in,char *out)
{
    /*
        %*[^[]  read and discard everything until it finds a square bracket
        [       read and discard the first square bracket
        %[^]]   read and store up up to (but not including) the closing square bracket
        %*[^\n] read and discard up to (but not including) the newline
    */
   return sscanf(in, "%*[^[][%[^]]%*[^\n]", out);

}

我遇到的问题出现在类型为[12. 0; 34.0;78.0],函数没有插入输出,我想不通。

uemypmqf

uemypmqf1#

我遇到的问题出现在类型为[12. 0; 34.0;78.0]。该函数不会在out中插入任何内容
扫描"%*[^[]"部分失败,因为未从"[12.0;34.0;78.0]"扫描任何内容。扫描随后停止。sscanf()返回0,不幸的是,代码在使用out之前未检查返回值。

sscanf(in, "%*[^[][%[^]]%*[^\n]", out);

保存时间,检查返回值。

// %*[^[]  read and discard everything until it finds a square bracket
%*[^[]  read and discard everything until it finds a square bracket, at least one non-'[' must be found.

高级:
在不知道目标大小的情况下保存到目标是糟糕的代码设计。

int stringInsideSquareBracket(const char *in, size_ out_size, char *out)

考虑strchar(),而不是使用sscanf()

// Return length of substring.
// Return -1 when not found or out[] too small.
long stringInsideSquareBracket_alt(const char *in, size_t out_size, char *out) {
  char *left = strchr(in, '[');
  if (left) {
    char *right = strchr(++left, ']');
    if (right) {
      size_t substring_length = right - left;
      if (out_size > substring_length) {
        memcpy(out, left, substring_length);
        out[ubstring_length] = 0;
        return substring_length;
      }
    }
  }
  if (out_size > 0) {
    out[0] = 0;
  }
  return -1;
}

相关问题