我正在尝试使用带有名字的文本文件(例如:john doe)并查找名字和姓氏。然后,我想使用这两个char数组并使用指针将它们连接在一起。 注释掉的代码是工作代码,它接受两个char数组并将它们放入一个char数组中,即将它们连接在一起。 这个项目要求我使用指针,并且我使用char数组我不是要求你为我做,但请帮助我意识到我做错了什么。感谢
编辑:我得到的错误是一个段错误。所以我在玩我的播放器是不是在某个地方出界?
void readPlayer(char *finName2, player *playerPtr)
{
player *playerHome = playerPtr;
ifstream fin;
char *tempfName= new char[20];
char *templName= new char[20];
char *tempName= new char[20];
char *tempNameHome = tempName;
fin.open(finName2);
if(!fin.good())
{
cout << "Error with player file!" << endl;
}
else
{
fin >> tempfName;
fin >> templName; //prime file
cout << tempfName << templName;
while(fin.good())
{
for(int i =0;i<5;i++)
{
//find the length
//int index =0, length=0;
while(*tempfName != '\0')
//while(tempfName[length] != '\0')
{
tempfName++;
}
strcopy(tempName,tempfName);
//now add space after first name
*tempName = ' ';
tempName++;
//tempfName[length] = ' ';
//tempfName++;
//length++;
while(*templName != '\0')
//while(templName[index] != '\0')
{
templName++;
//tempfName[length] = templName[index];
//length++;
//index++;
}
strcopy(tempName,templName);
//tempName++;
//tempfName[length]='\0';
strcopy((*playerPtr).name,tempName);
playerPtr++;
fin >> tempfName;
fin >> templName;
}
}
}
delete[] tempfName;
delete[] templName;
delete[]tempName;
}
答案 0 :(得分:0)
你的tempfName&amp; templName始终递增,并且超出了已分配的内存。你需要重置他们的位置 另外,我可以看到
fin >> tempfName;
fin >> templName;
在for循环中,这意味着fin.Good每5次检查一次。
答案 1 :(得分:0)
我看到的问题(在评论中也提到):
在循环中增加tempFName
和tempLName
while(*tempfName != '\0')
{
tempfName++;
}
strcopy(tempName,tempfName);
在上面的循环结束时,tempFName
指向字符串的末尾 - 它指向终止空字符。 strcopy
不应将任何内容复制到tempName
。
循环遇到同样的问题:
while(*templName != '\0')
{
templName++;
}
strcopy(tempName,templName);
在第一次循环后设置*tempName
的值
//now add space after first name
*tempName = ' ';
tempName++;
仅当tempName
指向调用strcopy
后复制的字符串的末尾时,此选项才有效。如果没有,您只需将tempName
中第一个字符的值设置为' '
即可。递增tempName
只有tempName
指向复制字符串末尾才有意义。否则,它指向第二个字符。
由于上述错误,您的代码在for
循环的第一次迭代后受到超出内存访问的错误。之后不能依赖于以合理的方式行事。
我建议进行以下更改以修复上述错误。
根本不增加变量tempFName
和tempLName
你根本不需要。
删除行:
while(*tempfName != '\0')
{
tempfName++;
}
只需使用:
strcopy(tempName,tempfName);
使用临时指针转到tempName
第一次致电strcopy
后,请使用:
char* temp = tempName;
while ( *temp != '\0' ) ++temp;
*temp = ' ';
++temp;
*temp = '\0';
使用第二个strcopy
删除行:
while(*templName != '\0')
{
templName++;
}
替换行:
strcopy(tempName,templName);
与
strcopy(temp,tempfName);
替代策略
如果您实施的是strcat
版本,则可以使用:
tempName[0] = '\0';
strcat(tempName, tempFName);
strcat(tempName, " ");
strcat(tempName, tempLName);
这将消除for
循环中的大部分混乱。