使用指针将两个char数组连接成单个char数组

时间:2014-09-29 04:08:25

标签: c++ arrays pointers

我正在尝试使用带有名字的文本文件(例如: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;
}

2 个答案:

答案 0 :(得分:0)

你的tempfName&amp; templName始终递增,并且超出了已分配的内存。你需要重置他们的位置 另外,我可以看到

fin >> tempfName;
fin >> templName;

在for循环中,这意味着fin.Good每5次检查一次。

答案 1 :(得分:0)

我看到的问题(在评论中也提到):

在循环中增加tempFNametempLName

        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循环的第一次迭代后受到超出内存访问的错误。之后不能依赖于以合理的方式行事。

我建议进行以下更改以修复上述错误。

根本不增加变量tempFNametempLName

你根本不需要。

删除行:

        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循环中的大部分混乱。