c - 从 C 中的函数返回字符串

标签 c string pointers

我有一个 c 函数,我想返回一个字符串。

如果我在返回之前打印字符串,那么我会看到 croc_data_0186.idx

如果我尝试打印返回的字符串,我会看到 croc_data_á☼

谁能看出我做错了什么?

问题函数:

char* getSegmentFileName(FILE *file, int lineLength, int lineNumber)
{
    char* fileNameString;

    fseek(file, lineNumber * lineLength, SEEK_SET);

    char line[lineLength];
    fgets(line, lineLength, file);

    char *lineElements[3];
    lineElements[0] = strtok(line, ":");
    lineElements[1] = strtok(NULL, ":");
    lineElements[2] = strtok(NULL, ":");

    fileNameString = lineElements[2];

    printf ("getSegmentFileName fileNameString is: %s \r\n", fileNameString);

    return fileNameString;
}

调用代码:

int indexSearch(FILE *file, char* value, int low, int high, char* segmentFileName)
{
    ...

    segmentFileName = getSegmentFileName(file, lineLength, mid);
    printf ("indexSearch: segmentFilename3 is: %s \r\n", segmentFileName);

    ...
}

最佳答案

您返回的是指向本地数据的指针,该指针在函数返回后无效。您必须正确分配字符串。

这可以在调用函数中完成,方法是向被调用函数提供一个缓冲区,并将字符串复制到提供的缓冲区。像这样:

char segmentFileName[SOME_SIZE];
getSegmentFileName(file, lineLength, mid, segmentFileName);

getSegmentFileName函数:

void getSegmentFileName(FILE *file, int lineLength, int lineNumber, char *segmentFileName)
{
    /* ... */

    strcpy(segmentFileName, fileNameString);
}

另一种解决方案是为getSegmentFileName中的字符串分配内存:

return strdup(fileNameString);

但是你必须记住稍后释放字符串。

关于c - 从 C 中的函数返回字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9378998/

相关文章:

c - 如何在不影响动态分配的其他数据的情况下动态分配内存?

regex - 删除第二个逗号之前的文本 ('' ,") 字符串替换模式

c - bmp 图像到 c 中的矩阵(二维数组)

string - Cassandra 中单个字符(或固定长度字符串)的数据类型

string - ColdFusion - 使用 RefindNoCase 查找字符串的最后一次出现

c++结构运算符重载不起作用

c - 危险的指针转换导致失去 const 资格

c - 访问结构的副本。我收到错误 : request for member ‘count’ in something not a structure or union

c++ - 如何在执行回调时隐藏顶级 GTK 窗口

c++ - #define/macro返回指向同一文件中给出的函数的函数指针