C 获取分段错误:11,在获取字符串上
我正在尝试从CS50库中获取字符串。C 获取分段错误:11,在获取字符串上,c,cs50,C,Cs50,我正在尝试从CS50库中获取字符串。get_string函数似乎会导致分段错误。你有什么建议吗 #包括 #包括 内部主(空){ 字符串回答=获取字符串(“你叫什么名字?”); printf(“你好,%s”,回答); } 好的,经过一些挖掘,我想我找到了罪犯。显然我们找不到它 Mac OS X显然有一个名为get\u string的内置符号,这就是为什么它在没有库的情况下编译,以及为什么它不断崩溃的原因 解决这个问题可能有几种方法 将cs50.c编译成二进制文件 提到了这种方法。我没有测试过它,但
get_string
函数似乎会导致分段错误。你有什么建议吗
#包括
#包括
内部主(空){
字符串回答=获取字符串(“你叫什么名字?”);
printf(“你好,%s”,回答);
}
好的,经过一些挖掘,我想我找到了罪犯。显然我们找不到它
Mac OS X显然有一个名为get\u string
的内置符号,这就是为什么它在没有库的情况下编译,以及为什么它不断崩溃的原因
解决这个问题可能有几种方法
将cs50.c
编译成二进制文件
提到了这种方法。我没有测试过它,但据报道它是有效的
按如下方式编译代码:
clang -ggdb3 -O0 -std=c99 hello.c ../../../github.com/cs50/lib50-c/src/cs50.c -o hello
其中,。/../../github.com/cs50/lib50-c/src/cs50.c
是文件cs50.c
的路径,该文件位于cs50
库源代码的子目录src
中-如果在您的计算机上不同,请使用正确的路径
您也可以将cs50.c
文件复制到带有hello.c
的目录中,只需指定不带路径的cs50.c
请注意,您必须在您的文件之后指定此文件,否则它将无法工作
实际上,在这种情况下,这就足够了:
cc hello.c cs50.c -std=c99 -o hello
从现在开始,每次编译代码时,您都需要在cs50.c
之后添加
重命名函数
由于我没有Mac电脑,我无法测试任何东西,因此我将列出一种肯定有效的方法-将函数get\u string
重命名为get\u string2
。这不是一个好的解决方案,但这是我现在能给你的全部
请仅在第一种方法无效时使用此方法
转到安装cs50的目录
通过发出命令将其卸载sudo make uninstall
在任何文本编辑器中从子目录src
打开文件cs50.h
搜索所有出现的get_string
并将其替换为get_string 2
(第108行有一个,第109行有两个)
保存并关闭文件
在任何文本编辑器中从子目录src
打开文件cs50.c
搜索所有出现的get\u string
并将其替换为get\u string2
(有很多)
保存并关闭文件
返回原始cs50构建目录并运行命令:
使用hello.c
编辑hello.c
并将get\u string
替换为get\u string2
使用cc hello.c-lcs50-o hello
编译并使用/hello
运行
在编译和执行之前,您可能还需要发出以下命令:
export LIBRARY_PATH=/usr/local/lib
export C_INCLUDE_PATH=/usr/local/include
export LD_LIBRARY_PATH=/usr/local/lib
从现在起,您需要将代码中get\u string
的每次使用更改为get\u string2
提交代码时不要忘记更改回原来的代码
或者,您可以在程序的开始处添加类似的内容:
#ifndef get_string2
#define get_string2 get_string
#endif
…这意味着对于运行您的代码的所有其他人(并且没有宏get\u string2
),这将定义get\u string2
与get\u string2
相同-因此您的代码将使用修改的和未修改的库
同样,这显然不是最好的方法,但由于我无法测试它,这是我能想到的最好的方法。对不起
如果有人提出更好的方法-那就太好了我不认为这段代码可以给出分段fault@EugeneSh. 这是终端输出:Macbook Pro:Clang Macbook$make hello cc hello.c-o hello Macbook Pro:Clang Macbook$。/hello分段错误:11可以,字符串(即char*
)可以为空,文档建议检查文档中的@JackWhite“以字符串形式返回读取行。如果用户只输入一行结尾,则返回“”,不为空。错误或无任何输入时返回NULL(即仅EOF)。“。听起来不太可能,除非OP故意向其提供EOF…我仍然认为OP并没有真正运行此代码。应该在-std=c99
中运行的同一目录中。应该防止定义任何非标准符号-如果这真的是问题,应该报告为编译器错误谢谢,这样编译是有效的!
#ifndef get_string2
#define get_string2 get_string
#endif