C - 返回值是部分且未满

时间:2012-05-09 12:57:35

标签: c return

我有一个file.txt,我在这里阅读每一行,我不想处理这些行。该文件包含IP,昵称和一些值。我想只保存IP地址到另一个文件,但在此之前我检查我的函数返回的结果(char * get_ip(char arr []))。 问题是返回的值,它只显示部分,例如:

正常IP地址:66.55.44.33
我的回报:66.55.44

编辑:

有两个功能:main()和get_ip()

//< ----------- FUNCTION get_ip()-------------------->

char* get_ip(char buff[]){

char line[32];

for(int i = 0; i < sizeof(buff); i++){
    if(buff[i] == '.'){
        if(isdigit(buff[i + 1])){
            i = 0;
            while(buff[i] != ' '){
                line[i] = buff[i];
                i++;
            }
            break;
        }
    }
}

if(isdigit(line[0]))
    return line;
else
    return 0;

}

//&lt; ------------ FUNCTION int main()---------------------&gt;

int main(){
// variable, opening folder etc.

char buff[64], *line;

while(!feof(fph)){
    fgets(buff, 63, fph);
    line = get_ip(buff);

    if(line)
        cout << line << "\n";
}

} // main() func. end

3 个答案:

答案 0 :(得分:3)

当前预期行为未定义,因为line是局部变量,不允许从函数返回。如果你希望它是buff的单独缓冲区,你应该使用malloc而不是声明char line[32];

答案 1 :(得分:2)

可能存在一个问题:

for(int i = 0; i < sizeof(buff); i++){

特别是声明

sizeof(buff)

虽然您可能已经预料到这会返回64(缓冲区的大小),但您忘记了C数组几乎总是衰减到指针,所以这实际上是返回4(如果是32位)或8(如果是64位) ),char *的大小。

您需要明确传入大小。

答案 2 :(得分:2)

你应该显示更多的代码:你的签名至少起作用。

您正在堆栈上分配buff,然后将其返回。

但是数组按值返回never,它们会被衰减为指向第一个元素的指针。 这意味着,当您使用这样的函数时:

char[32] myFunction(...);

char ip[32] = myFunction(...);

您的ip数组初始化时使用指向数组(line)的指针,该数组在myFunction返回后超出范围时被销毁!

这意味着,它包含一个垃圾,你很幸运,你甚至得到了部分结果(尽管如果它完全是垃圾,你可能更容易跟踪问题)。

可能的补救措施是使用std::string(我推荐)或将指向预分配数组的指针传递给myFunction(C风格的解决方案):

char[32] ip;

myFunction(ip, ...);