我有一个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
答案 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, ...);