理解C语言中的字符串赋值

理解C语言中的字符串赋值,c,string,char,return,strcat,C,String,Char,Return,Strcat,好的,我已经阅读了大量的答案,还有很多其他的地方,但我似乎不能理解这个简单的函数。请原谅我这么简单的一件事,我已经8年没有做过c/c++代码了,我正在努力重新学习,所以请耐心等待 我尝试了许多不同的方法来实现这一点,从通过函数param赋值到直接返回值,但在这段时间内似乎没有任何效果。我在编译时也没有收到错误,但在运行时确实收到了SEGFULTS。我很想知道为什么下面的函数不起作用。。。我只是不明白为什么else返回的是char*content,而不是strcat(content,line);没

好的,我已经阅读了大量的答案,还有很多其他的地方,但我似乎不能理解这个简单的函数。请原谅我这么简单的一件事,我已经8年没有做过c/c++代码了,我正在努力重新学习,所以请耐心等待

我尝试了许多不同的方法来实现这一点,从通过函数param赋值到直接返回值,但在这段时间内似乎没有任何效果。我在编译时也没有收到错误,但在运行时确实收到了SEGFULTS。我很想知道为什么下面的函数不起作用。。。我只是不明白为什么else返回的是char*content,而不是strcat(content,line);没有。尽管strcat的手册页显示strcat的定义应该是(char*DEST,const char*SRC)。据我目前所知,在while内对line变量上的const char进行强制转换只会将一个整数返回到指针。所以我在这里被难住了,我想让那些有时间的人来教育我

char * getPage(char *filename) {
    FILE *pFile;
    char *content;
    pFile = fopen(filename, "r");
    if (pFile != NULL) {
        syslog(LOG_INFO,"Reading from:%s",filename);
        char line [256];
        while (fgets(line, sizeof line, pFile) != NULL) {
            syslog(LOG_INFO,">>>>>>>Fail Here<<<<<<<");
            strcat(content, line);
        }
        fclose(pFile);
    } else {
        content = "<!DOCTYPE html><html lang=\"en-US\"><head><title>Test</title></head><body><h1>Does Work</h1></body></html>";
        syslog(LOG_INFO,"Reading from:%s failed, serving static response",filename);
    }
    return content;
}
char*getPage(char*filename){
文件*pFile;
字符*内容;
pFile=fopen(文件名,“r”);
if(pFile!=NULL){
系统日志(日志信息,“读取:%s”,文件名);
字符行[256];
while(fgets(line,sizeof line,pFile)!=NULL){

syslog(LOG_INFO,“>>>>>>>>>此处失败内容只是指向字符串的指针,而不是实际字符串-它为字符串保留了0字节的空间。您需要分配足够大的内存来容纳小时字符串。请注意,之后您必须释放它

char *content=malloc(256);
你的代码应该还可以-哦,我建议使用strncat

之前,对内容的第二次赋值工作正常-因为您正在设置指向常量字符串的指针。如果您将内容更改为内存的malloc'ed区域,那么您还需要将固定字符串strncp到内容中


理想情况下,如果你可以使用C++ STD::String。

< P>内容只是一个字符串的指针而不是实际的字符串——它有0字节的空间保留给你的字符串。你需要分配足够大的内存来保存小时字符串。注意,在你必须释放它之后,

char *content=malloc(256);
你的代码应该还可以-哦,我建议使用strncat

之前,对内容的第二次赋值工作正常-因为您正在设置指向常量字符串的指针。如果您将内容更改为内存的malloc'ed区域,那么您还需要将固定字符串strncp到内容中


理想情况下,如果你可以使用C++ STD::String。

< p>你需要为<代码>内容<代码>分配内存。它必须足够大,以整个文件的方式来做。你可以预先分配一个巨大的缓冲区,并希望最好的,或者分配一个较小的缓冲区,并根据需要重新分配它。 更好的方法是重新排列代码,避免一次存储整个文件,尽管如果调用方需要整个网页作为字符串,这可能会很困难


还请注意,您需要从两个代码路径返回相同类型的内存。有时不能返回静态字符串,有时不能返回堆分配的字符串。这肯定会导致头痛和/或内存泄漏。因此,如果要将文件内容复制到内存块中,还应将静态字符串复制到sam中e块类型。

您需要为
内容分配内存。
必须足够大,以您的方式容纳整个文件。您可以预先分配一个巨大的缓冲区,并希望达到最佳效果,或者分配一个较小的缓冲区,并根据需要重新分配

更好的方法是重新排列代码,避免一次存储整个文件,尽管如果调用方需要整个网页作为字符串,这可能会很困难


还请注意,您需要从两个代码路径返回相同类型的内存。有时不能返回静态字符串,有时不能返回堆分配的字符串。这肯定会导致头痛和/或内存泄漏。因此,如果要将文件内容复制到内存块中,还应将静态字符串复制到sam中块的类型。

content
是一个野生指针;该变量包含垃圾,因此它指向左字段的某个位置。当您使用
strcat
将数据复制到该变量时,数据会到达某个随机的、可能不好的位置。解决方法是将
content
指向某个好的位置。因为您希望它比您的寿命长r函数调用时,需要将其分配到函数调用堆栈之外的某个位置。您需要使用
malloc()
在堆上分配一些空间。然后调用方将拥有内存,并应在不再需要时调用
free()
将其删除

您还需要将直接分配给
内容的
else
部分更改为使用
strcpy
,以便
free()
始终有效。您无法释放未分配的内容


在所有这些代码中,请确保记住使用
malloc()分配了多少空间
,并且不要写入超过空间的数据,否则会发生更多的崩溃。

content
是一个野生指针;该变量包含垃圾,因此它指向左字段的某个位置。当您使用
strcat
将数据复制到它时,数据会进入一些随机的、可能是错误的位置。解决方法是使
con帐篷
指向一个好的地方。因为您希望它比函数调用更长寿,所以需要将它分配到函数调用堆栈之外的某个地方。您需要使用
malloc()
在堆上分配一些空间。然后调用方将拥有内存,并且应该在不再需要时调用
free()
将其删除

您需要更改直接分配给
内容的
else
部分
char content[256];
FILE *fp = fopen(filename, "r");
if (!fp) {
    syslog(LOG_INFO, "failed to open %s: %s", filename, strerror(errno));
    return xstrdup("<!DOCTYPE html><html lang=\"en-US\"><head><title>Test</title>"
                  "</head><body><h1>Does Work</h1></body></html>");
} else {
    size_t capacity = 4096, offset = 0, n;
    char *content = xmalloc(capacity);
    size_t n;
    while ((n = fread(content + offset, 1, capacity - offset, fp)) > 0) {
        offset += n;
        if (offset == capacity) {
            capacity *= 2;
            content = xrealloc(content, capacity);
        }
    }
    if (n < 0)
        syslog(LOG_INFO, "read error from %s: %s", filename, strerror(errno));
    content[offset] = '\0';
    fclose(fp);
    return content;
}