0

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

普通IP地址:66.55.44.33
我的回报:66.55.44

编辑:

有2个功能:main()get_ip()

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

    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;
}

//<------------ FUNCTION int main() --------------------->


    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
4

3 回答 3

3

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

于 2012-05-09T13:06:33.667 回答
2

可能存在一个问题:

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

特别是声明

sizeof(buff)

虽然您可能期望它返回 64,即缓冲区的大小,但您忘记了 C 数组几乎总是衰减为指针,所以这实际上返回 4(如果 32 位)或 8(如果 64 位),的大小char *

您需要显式传递一个大小。

于 2012-05-09T13:09:58.173 回答
2

您应该显示更多代码:至少您的功能签名。

buff在堆栈上分配,然后返回它。

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

char[32] myFunction(...);

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

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

这意味着,它包含一个垃圾,您很幸运,您甚至可以从中获得部分结果(尽管如果它是完整的垃圾,您可能会更容易跟踪问题)。

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

char[32] ip;

myFunction(ip, ...);
于 2012-05-09T13:10:01.363 回答