Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 获取分段错误:11,在获取字符串上_C_Cs50 - Fatal编程技术网

C 获取分段错误:11,在获取字符串上

C 获取分段错误:11,在获取字符串上,c,cs50,C,Cs50,我正在尝试从CS50库中获取字符串。get_string函数似乎会导致分段错误。你有什么建议吗 #包括 #包括 内部主(空){ 字符串回答=获取字符串(“你叫什么名字?”); printf(“你好,%s”,回答); } 好的,经过一些挖掘,我想我找到了罪犯。显然我们找不到它 Mac OS X显然有一个名为get\u string的内置符号,这就是为什么它在没有库的情况下编译,以及为什么它不断崩溃的原因 解决这个问题可能有几种方法 将cs50.c编译成二进制文件 提到了这种方法。我没有测试过它,但

我正在尝试从CS50库中获取字符串。
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