2012-05-29 52 views
-2

我用C++編碼,真的很簡單的東西。'函數的參數太少'char * strncpy(char *,const char *,size_t)'是什麼意思?

using namespace std; 

int main(){ 
    char cName[30], cFirst[15], cSur[30]; 


    cout << "Enter your name: " << endl; 
    cin.getline(cName, 29); 


    for(int i = 0; i < 29; i++) 
     if(cName[i] == ' ') 
     break; 

    strncpy(cFirst, cName, i); 


    cFirst[i] = '\0'; 
    strncpy(cSur,cName + i + 1); 
    cSur[i] = '\0'; 
    cout << cSur << endl; 
    return 0; 
} 

然而,程序停止運行時編譯strncpy(cFirst, cName, i);,我得到這個錯誤信息「參數太少函數 '字符*函數strncpy(字符*,爲const char *,爲size_t)'。有人能解釋我做錯了什麼嗎?

+6

確定錯誤不在這行'strncpy(cSur,cName + i + 1);'? –

+1

錯誤信息不清楚嗎? –

+1

除了編譯器錯誤(由於沒有將足夠的參數傳遞給strncpy引起),如果某人的名字長於15個字符,該程序具有未定義的行爲(即可能會出現段錯誤) - cName僅包含15個字符,但在在線''strncpy(cFirst,cName,i)','i'可以大於15. –

回答

8

strncpy()有三個參數,只有兩個在第二呼叫被提供:

strncpy(cSur,cName + i + 1); 

由於這是C++,考慮使用std::string代替char[](或char*)。有一個std::getline()版本,它將std::string作爲參數並填充它,從而消除了對固定長度數組的需求。然後,您可以使用std::string::find()std::string::substr()到線分成姓氏和名字:

std::string full_name("john prog rammer"); 

const size_t first_space_idx = full_name.find(' '); 
if (std::string::npos != first_space_idx) 
{ 
    const std::string first_name(full_name.substr(0, first_space_idx)); 
    const std::string surname(full_name.substr(first_space_idx + 1)); 
} 
+0

感謝您的支持,但是這是一個提高我對C++語言的熟悉度的練習,所以我選擇使用char數組。今後爲了編寫更好的代碼,我將使用字符串類型。 – LegItJoe

+0

'std :: string'是語言的一部分。 – hmjd

4

這意味着,很顯然,如果你問我,你只提供2個參數,而不是3:

strncpy(cSur,cName + i + 1); 
+0

是的,謝謝他們的迴應。我改變了strncpy(cSur,cName + i + 1);到strcpy(cSur,cName + i + 1);該程序能夠編譯。請有些人解釋一下這個區別? – LegItJoe

+1

@LegItJoe:'strncpy()'帶3個參數,'strcpy()'帶2個參數。前者中的附加參數是您打算複製的字符數。當函數被調用時存在*類型檢查*,函數調用中的參數數量必須與函數聲明中的參數數量匹配。 –

+0

@LegItJoe他說的。你可以從谷歌找到這些東西。 –

2

它的抱怨,它需要在3個參數,但你不能提供3

這將是該行:

strncpy(cSur,cName + i + 1); 

這裏你只提供2,因爲你正在添加我和1到cName