2012-05-29 137 views
0

這裏是C++新手。編寫一個簡單的程序。除了當我嘗試提取姓氏和姓氏並單獨打印這些內容時,一切都有效,以姓氏打印的字母數量將始終與名字中的數字相同。因此,如果名字是傑克遜,程序將打印firstname作爲:will和第二名稱:jack。我該如何解決這個問題?爲什麼strcpy只能複製有限數量的元素:

這裏是代碼

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; 
+0

'cAddress','cFirst'和'cSur'的類型是什麼? '炭[]'? '字符*'? 'string'? –

+0

cSur [i] ='\ 0'; –

+4

另一方面,如果你使用C++,通常很少有理由使用舊的C風格的函數,比如'strcpy'。你應該研究一下'std :: string',因爲它更乾淨。 –

回答

2

您在添加\0字符第(i + 1)個位置 - 這標誌着字符串的結尾,讓這一切都打印。在該行之前,cSur可能包含整個姓氏。

+0

cAddress,cFirst和cSur是char數組 – LegItJoe

+0

確切地說,當你在char數組的任何地方添加一個'\ 0'字符時,這代表「字符串的結尾」。所以刪除該行,你應該沒問題:) – Ansari

+0

謝謝。我嘗試刪除該行,並將其放置到位strcpy(cSur,cAddress + i + 1); if(cAddress [i] =='@') cSur [i] ='\ 0';所以當閱讀這些星號時,程序會意識到這是你姓氏的結尾。然而這仍然不起作用。所以對於像[email protected]這樣的地址,我怎麼能提取史密斯? – LegItJoe

2

你的代碼大部分看起來很像C - 甚至沒有充分利用C標準庫。在C++中,我會寫更多的東西一樣:

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

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

如果出於某種原因,你堅持用C風格的字符串,你可能會考慮與strpbrk開始找到的分隔符。

0
cSur[i] = '\0'; 

不正確。我是名字的長度。 cSur已經被strcpy終止了零。

解釋說,傑里科芬的答案是我會推薦爲好的C++代碼。

相關問題