c/c++语言开发共享如果我忘记关闭扫描设备会发生什么?

假设我忘了关闭扫描组的右方括号] 。 那会发生什么? 它会调用未定义的行为吗?

例:

 char str[] = "Hello! One Two Three"; char s1[50] = {0}, s2[50] = {0}; sscanf(str, "%s %[^h", s1, s2); /* UB? */ printf("s1='%s' s2='%s'n", s1, s2); 

我在编译时收到GCC的警告:

 source_file.c: In function 'main': source_file.c:11:5: warning: no closing ']' for '%[' format [-Wformat=] sscanf(str, "%s %[^h", s1, s2); /* UB? */ 

和输出为

 s1='Hello!' s2='' 

我也注意到sscanf返回1.但是到底发生了什么?

我检查了C11标准,但没有找到与此相关的信息。

    优秀! 您应该为C11提交缺陷报告!

    这是C11 7.21.6.2中的相关部分

    转换说明符包括格式字符串中的所有后续字符,包括匹配的右括号(])。 括号(扫描列表)之间的字符组成扫描集,除非左括号后面的字符是抑扬符(^),在这种情况下,扫描集包含旋转和右括号之间的扫描列表中未出现的所有字符。

    对括号之间的字符的严格解释是,在没有右括号的情况下,没有这样的字符,但是在存在^作为[之后的第一个字符时,它将是不一致的。 gcc足以指出源代码中的可能错误。 实际行为由C库实现确定,但似乎没有在C标准中指定。 因此,它是一种未定义的行为forms,恕我直言应该在标准中真正记录。

      以上就是c/c++开发分享如果我忘记关闭扫描设备会发生什么?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/549456.html

      (0)
      上一篇 2021年1月14日
      下一篇 2021年1月14日

      精彩推荐