C - cs50.h获取字符串错误

1zmg4dgp  于 2022-12-22  发布在  其他
关注(0)|答案(6)|浏览(183)

Hello我是编程世界的新手,我正尝试在线学习哈佛的CS50课程。在制作我的“Hello World”程序时,我下载了“cs50.h”来定义GetStringstring(至少我认为是这样)。
文件.c:

#include "cs50.h"
#include <stdio.h>

int main(int argc, string argv[])
{
    string name;
    printf("Enter your name: ");
    name = GetString();
    printf("Hello, %s\n", name);
}

然而,每当我尝试make file时,就会发生这种情况:

cc     file.c   -o file
Undefined symbols for architecture x86_64:
"_GetString", referenced from:
  _main in file-JvqYUC.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [file] Error 1

以下是cs50.h文件的链接(如果有帮助):http://dkui3cmikz357.cloudfront.net/library50/c/cs50-library-c-3.0/cs50.h
我想知道为什么我得到这个错误,我如何可以修复它。请帮助。

crcmnpdw

crcmnpdw1#

您似乎忘记从http://dkui3cmikz357.cloudfront.net/library50/c/cs50-library-c-3.0/cs50.c下载并链接到项目cs50.c文件

  • .h通常只包含声明。*.c(对于C)和 *.cpp(对于C++)包含实现。

此类中有GetSting函数实现:

string GetString(void)
{
    // growable buffer for chars
    string buffer = NULL;

    // capacity of buffer
    unsigned int capacity = 0;

    // number of chars actually in buffer
    unsigned int n = 0;

    // character read or EOF
    int c;

    // iteratively get chars from standard input
    while ((c = fgetc(stdin)) != '\n' && c != EOF)
    {
        // grow buffer if necessary
        if (n + 1 > capacity)
        {
            // determine new capacity: start at 32 then double
            if (capacity == 0)
                capacity = 32;
            else if (capacity <= (UINT_MAX / 2))
                capacity *= 2;
            else
            {
                free(buffer);
                return NULL;
            }

            // extend buffer's capacity
            string temp = realloc(buffer, capacity * sizeof(char));
            if (temp == NULL)
            {
                free(buffer);
                return NULL;
            }
            buffer = temp;
        }

        // append current character to buffer
        buffer[n++] = c;
    }

    // return NULL if user provided no input
    if (n == 0 && c == EOF)
        return NULL;

    // minimize buffer
    string minimal = malloc((n + 1) * sizeof(char));
    strncpy(minimal, buffer, n);
    free(buffer);

    // terminate string
    minimal[n] = '\0';

    // return string
    return minimal;
}
qgelzfjb

qgelzfjb2#

看看你的第一个include语句,你用““代替了〈〉。

uqcuzwp8

uqcuzwp83#

在CS50课程的视频中,讲师使用插入符号(〈〉)而不是引号(““)。

fjaof16o

fjaof16o4#

对于学习CS50类的任何人,如果不想每次都粘贴.c代码,也可以在编译时链接CS50代码。
将cs50.h和cs50.c放在与file. c相同的目录中,然后在命令行中键入以下命令:

clang file.c -lcs50 -o <file name>

“-l”将cs50.c和cs50.h文件链接到您的c文件(在编译为目标文件之后),“-o”指定编译输出的放置位置。
有关此here的更多信息

tag5nh1u

tag5nh1u5#

In your #include"cs50.h" header you should be typing it like this: #include<cs50.h>. Also, try doing:

#include<cs50.h>
#include<stdio.h>

int main(void)
{

string name = get_string("Enter your name: ");
printf("%s\n", name);

}

而不是这个:

#include "cs50.h"
#include <stdio.h>

int main(int argc, string argv[])
{
    string name;
    printf("Enter your name: ");
    name = GetString();
    printf("Hello, %s\n", name);
}

这样就可以消 debugging 误消息。
注:在第二周,他们会告诉你help50,但是如果你想的话,你现在就可以使用它。我自己发现它非常有用。下面是它的工作原理:在你的终端窗口(你执行./hello和clang的窗口)你应该输入:"help50 make hello"(不带引号),然后它将键入:请求帮助...用黄色显示。然后它会破译错误信息,并用更简单的语言输入。例如:

#include <stdio.h>
#include <cs50.h>

int main(void)
{
 



string name = get_string("Enter your name: ");
printf("%s\n", name)

    
}

我打了个招呼,就出现了这个:

clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow    hello.c  -lcrypt -lcs50 -lm -o hello
hello.c:13:21: error: expected ';' after expression
printf("%s\n", name)
                    ^
                    ;
1 error generated.
<builtin>: recipe for target 'hello' failed
make: *** [hello] Error 1

但是当我使用help50 make hello时,显示如下:

clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow    hello.c  -lcrypt -lcs50 -lm -o hello
hello.c:13:21: error: expected ';' after expression
printf("%s\n", name)
                    ^
                    ;
1 error generated.
<builtin>: recipe for target 'hello' failed
make: *** [hello] Error 1

Asking for help...

hello.c:13:21: error: expected ';' after expression
printf("%s\n", name)
                    ^
                    ;

Are you missing a semicolon at the end of line 13 of hello.c?

正如您所看到的,现在我知道了问题所在,并且可以解决它。Help50将错误消息解释为您可以理解的语言。

6ojccjat

6ojccjat6#

你最好使用习题集1中的链接......它会引导你到Github中的VS代码应用程序,它已经为CS50配置好了。

相关问题