C++ 为什么strcpy只复制有限数量的元素:

C++ 为什么strcpy只复制有限数量的元素:,c++,codeblocks,strcpy,strncpy,C++,Codeblocks,Strcpy,Strncpy,这里是C++新手。编写一个简单的程序。一切都正常,除了当我试图提取名字和姓氏并单独打印它们时,姓氏中打印的字母数将始终与名字中的数字大小相同。因此,如果名字是威尔·杰克逊,程序将把第一个名字打印为:威尔,第二个名字打印为:杰克。我如何解决这个问题 这是密码 for( i = 0; i < 19; i++) if(cAddress[i] == ' ' || cAddress[i] == '_' || cAddress[i] == '-' || cAddress[i] == '.')

这里是C++新手。编写一个简单的程序。一切都正常,除了当我试图提取名字和姓氏并单独打印它们时,姓氏中打印的字母数将始终与名字中的数字大小相同。因此,如果名字是威尔·杰克逊,程序将把第一个名字打印为:威尔,第二个名字打印为:杰克。我如何解决这个问题

这是密码

for( i = 0; i < 19; i++)
  if(cAddress[i] == ' ' || cAddress[i] == '_' || cAddress[i] == '-' || cAddress[i] == '.')
    break;

strncpy(cFirst, cAddress, i);

cFirst[i] = '\0';
cout << endl << "\n";
cout << "Your first name is " << cFirst << endl;

strcpy(cSur,cAddress + i + 1);
cSur[i] = '\0';
cout << endl;
cout << "Your surname is " << cSur << endl;
(i=0;i<19;i++)的

如果(cAddress[i]=''| | cAddress[i]=''| | | cAddress[i]='-'| | cAddress[i]='.)
打破
strncpy(cFirst,cAddress,i);
cFirst[i]='\0';

cout您正在第(i+1)个位置添加一个
\0
字符-这标志着字符串的结束,所以它只打印这些字符。在这一行之前,cSur可能包含整个姓氏。

您的大多数代码看起来很像C,甚至没有充分利用C标准库。在C++中,我会写一些类似:

int pos = Address.find_first_of(" _-.");

std::string FirstName(Address, 0, pos);
std::string SurName(Address, pos);

如果出于任何原因,你坚持使用C风格字符串,你可以考虑从中找出分隔符。

cSur[i] = '\0';
这是不正确的。我是第一个名字的长度。cSur已由strcpy以零结尾


解释过,Jerry Coffin的答案是我推荐的好的C++代码。< /P> <代码> > C><代码>,<代码> Cube < /C> >和<代码> CUS?代码>字符[]

<代码>字符*<代码>字符串< /代码>?在一个旁注下,如果您在C++中工作,通常很少有理由使用旧的C样式函数,例如“代码> StrcPy < /Cord>。您应该研究
std::string
,因为它更干净。CadAddress、cFirst和cSur都是字符数组,当您在字符数组中的任何位置添加
\0
字符时,这表示“字符串结束”。所以删除该行,您应该会很好:)谢谢。我试着移除该行并将其放置在strcpy(cSur、cAddress+I+1)的适当位置;如果(CADRESS[i]='@')cSur[i]='\0';因此,当读取星号时,程序会意识到这是您姓氏的结尾。然而,这仍然不起作用。像约翰这样的地址也是如此。smith@hotmail.com,我如何提取史密斯?@LegItJoe:如果你想在名字中找到@,你必须先写一行来找到它,就像你在查找名字/姓氏分隔符时所做的那样。