我在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时,打印正常,但在运行后我有分段错误。 我喜欢像脚本一样运行。
答案 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
的地址传递给scanf
和printf
,而应传递path
本身。
由于您正在扫描字符串,请使用%s
代替%a
答案 3 :(得分:1)
首先,如果你在这里做的时候将一个null传递给scanf,你基本上是告诉c库复制输入到null空间的任何字符串(也就是内存的第一页,通常是防止写入因为这个原因)。其次,%a应该匹配浮点数,而不是字符串。第三,在开始调用之前,实际阅读库函数的文档可能是一个好主意。