`
febird
  • 浏览: 254227 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

小技巧,大智慧:%n of sscanf

 
阅读更多

scanf 系列中有个函数 sscanf,可能有人用过,它的普通用法,我就不讲了,可以参考这里:man 3 sscanf

gnu c 实现了 C 标准的 format specify 的 %n,它的含义是返回从该次 XXscanf 调用开始到此读了多少个字节,我们可以利用这一点,来实现不需要内存分配的%s

假定我们读取一批商品记录,每条记录包含商品ID,商品名称,商品价格,各字段的类型在代码中是自包含的


%*s 用来扫描但跳过(不存储)一个字符串,两个 %n,前一个得到name的起始偏移,后一个得到name的结束偏移……其它的,也就不用我多说了。

%n 应该是 C99 新加入的,不过这一点我不太确信,但 gnu 里面的确有这个实现,msvc 里面没有,其他的环境就不太清楚了。如果是写服务器应用,一般就不用担心它是否实现(95%以上的服务器都该有gnu环境吧,况且 glibc 和gcc是相对独立的)。

%n 特性真可谓小技巧,大智慧,我很长一段时间不知道这个东西,还一直为 XXprintf 系列可以得到已写出的字节数,而 XXscanf 无法得到已读取的字节数犯愁。

我觉得在新代码中应该使用该技巧取代 %s,当然,gnu 的 XXscanf 里面还有个 %as,它返回一个由系统 malloc 出来的字符串,需要用户自己调用 free 来释放它。如果是写纯 C 代码,并且字符串需要保存起来长期使用,应该使用 %as,否则应该使用我提到的这个技巧。

分享到:
评论

相关推荐

    sscanf()用法domeVs2010

    `sscanf()` 函数是C语言中的一个输入格式化函数,它是`scanf()` 的变体,主要用于从字符串中读取数据。在Visual Studio 2010环境下,开发者经常使用`sscanf()`来处理字符串输入,特别是在需要从已有的字符串中解析...

    sscanf使用方法

    `sscanf`是C语言标准库中的一个函数,主要用于从字符串中读取数据,它是`scanf`函数的字符串版本。`sscanf`函数在处理文本输入时非常灵活,可以用于从格式化的字符串中提取信息,这在编程中尤其是在处理用户输入或者...

    sscanf函数的高级用法

    ### sscanf函数的高级用法详解 #### 一、sscanf函数概述 `sscanf`是C语言中的一个标准库函数,用于从一个字符串中解析指定格式的数据。它类似于`scanf`函数,但输入源不是标准输入(如键盘),而是用户指定的字符...

    sscanf和sprintf输入输出控制

    ### sscanf和sprintf输入输出控制 #### 一、sscanf函数详解 **sscanf** 是一个强大的函数,用于从字符串中解析格式化的输入。它的工作原理类似于 **scanf** 函数,但是 **sscanf** 从一个字符串中读取数据而不是从...

    sscanf ,sscanf ,sscanf

    ### sscanf详解:灵活处理字符串的强大工具 在C语言中,`scanf` 和 `sscanf` 是处理输入数据的两个重要函数,尤其适用于读取特定格式的文件或处理字符串。尽管它们的功能相似,但应用场景有所不同。`scanf` 主要...

    sscanf_sscanf_solutioncw5_

    在标题"sscanf_sscanf_solutioncw5_"中,暗示了这是一个关于`sscanf`的解决方案集合,可能是为了帮助用户更好地理解和应用`sscanf`函数。标签"sscanf solutioncw5"进一步确认了这一点。 `sscanf`函数的语法如下: `...

    sscanf()的用法

    需要注意的是,`sscanf()`不会检查输入字符串是否符合格式,因此有可能导致缓冲区溢出,使用时需要确保目标变量足够大以容纳读取的数据。 总的来说,`sscanf()`是C语言中一个强大的字符串解析工具,适用于从格式化...

    sscanf函数的用法[定义].pdf

    `sscanf`函数是C语言中的输入格式化函数,它从指定的字符串中解析数据,并按照指定的格式将其转换到变量中。这个函数是`scanf`系列的一部分,主要用于处理字符串而不是标准输入。以下是对`sscanf`函数的详细说明: ...

    关于sscanf函数

    ### 关于sscanf函数 #### 一、简介 `sscanf`函数是C语言标准库中的一个重要函数,用于从字符串中解析数据,并将其存储到指定的变量中。它的工作方式与`scanf`函数非常相似,但`scanf`是从标准输入(如键盘)读取...

    sscanf函数的高级用法doc

    ### sscanf函数的高级用法详解 #### 一、sscanf函数简介 `sscanf`是C语言中的一个标准库函数,用于从一个字符串中解析出指定格式的数据,并将其存储到对应的变量中。它与`scanf`函数非常相似,但不同之处在于`...

    sscanf 表达式详解

    ### sscanf 表达式详解 #### 一、概述 `sscanf`是C语言标准库中的一个函数,用于从字符串中解析数据,并将其存储到指定的变量中。它的工作方式与`scanf`相似,但其输入来源不是键盘而是内存中的字符串。`sscanf`...

    sscanf 详解

    ### sscanf详解 #### 一、概述 `sscanf`是C标准库中的一个函数,用于从字符串中解析数据。它的工作原理与`scanf`类似,只不过`scanf`是从标准输入流(通常是键盘)读取数据,而`sscanf`则是从一个固定的字符串中...

    sscanf,sprintf,fscanf,fprintf 系列函数的用法小结 doc

    ### sscanf,sprintf,fscanf,fprintf 系列函数的用法小结 #### 1. sscanf函数 **函数原型:** ```c int sscanf(const char *str, const char *format, ...); ``` **功能说明:** `sscanf`函数类似于`scanf`,...

    sscanf函数.pdf

    sscanf 函数的使用和格式详解 sscanf 函数是 C 语言中的一个输入函数,用于从一个字符串中读取数据并将其存储到变量中。函数原型为 `int sscanf(string str, string fmt, mixed var1, mixed var2 ...);`。sscanf ...

    sscanf练习详解-分割字符串

    在C语言和C++中,`sscanf`函数是`scanf`家族的一部分,用于从已格式化的字符串中读取数据。这个函数对于处理固定格式的数据输入非常有用,尤其是在需要从字符串中提取特定部分时。本篇文章将深入讲解如何使用`sscanf...

    C语言实验报告—实验7-结构体.doc

    可以通过 `fgets` 函数来读取带有空格的字符串,并使用 `sscanf` 或者 `strtok` 来解析出姓名。 2. **排序后名次计算问题**:最初按照简单的顺序给学生分配名次,但在处理总分相同的情况时出现了问题。通过引入额外...

    重要知识sscanf函数.pdf

    sscanf 函数详解 sscanf 函数是 C 语言中用来从字符串中读取数据的函数,类似于 scanf 函数,但 scanf 函数从标准输入流中读取数据,而 sscanf 函数从字符串中读取数据。sscanf 函数的原型为: `int sscanf(string...

Global site tag (gtag.js) - Google Analytics