mac上的scanf()问题

时间:2010-08-30 14:37:52

标签: c macos scanf

我在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时,打印正常,但在运行后我有分段错误。 我喜欢像脚本一样运行。

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

%a是对scanf grabs的gnu特定的非标准扩展。您的操作系统X的内容是什么说的?

  

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

^是你的意图吗?

在这种情况下,请注意

  

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

答案 2 :(得分:1)

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

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

由于您正在扫描字符串,请使用%s代替%a

答案 3 :(得分:1)

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