【问题标题】:Problem with scanf() on macmac上的scanf()问题
【发布时间】:2010-08-30 14:37:52
【问题描述】:

我在 mac os x 上编译了一个 C 库。当我输入输入并在屏幕上打印数据后,我什么也看不到。

char *path = NULL; peerdisplay = "Bob"; printf("Insert the full 'To' path: "); scanf(" %a[^\n]", &path); printf("A path: %s \n", &path);

当我将 %a 替换为 %s 时,打印正常,但运行后出现分段错误。 我喜欢跑脚本之类的。

【问题讨论】:

    标签: c macos scanf


    【解决方案1】:

    %a 是对 scanf 抓取的 gnu 特定的非标准扩展。您的 OS X 手册页对此有何评论?

    GNU C 库支持非标准扩展,它会导致 库为输入动态分配足够大小的字符串 %s 和 %a[range] 转换说明符的字符串。来利用 对于此功能,将 a 指定为长度修饰符(因此 %as 或 %a[范围])。调用者必须释放(3)返回的字符串

    ^这是你的意图吗?

    在这种情况下,请注意

    如果程序使用 gcc 编译,a 修饰符不可用 -std=c99 或 gcc -D_ISOC99_SOURCE(除非 _GNU_SOURCE 也是指定的 fied),在这种情况下, a 被解释为浮动说明符 点数(见上文)。

    【讨论】:

      【解决方案2】:

      您需要为路径分配内存。它需要有足够的内存用于输入任何字节,加上 NULL 终止字节。

      【讨论】:

        【解决方案3】:

        你的path是一个空指针,让它指向一些足够大的分配内存来保存要读取的字符串和终止null字符。

        您不应将path 的地址传递给scanfprintf,而应传递path 本身。

        由于您正在扫描字符串,请使用 %s 而不是 %a

        【讨论】:

          【解决方案4】:

          首先,如果您在此处将 null 传递给 scanf,则基本上是在告诉 c 库将输入的任何字符串复制到 null 空间(也就是内存的第一页,通常防止写入正是因为这个原因)。其次, %a 应该匹配浮点数,而不是字符串。第三,在开始调用库函数之前实际阅读文档可能是个好主意。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-21
            • 2011-07-21
            • 2012-03-18
            相关资源
            最近更新 更多