2013-07-02 46 views
0

我是C++的新手,無法爲函數的char *賦值。我有一個函數如下返回布爾bool函數的返回值和傳遞的指針作爲參數

bool Function(char* inString) 
{ 
     int m = strlen(inString); 
    char output[1001]; 
    memset(output , 0 , sizeof(output)); 
    sprintf_s(output,50,"length is %d",m); 

     if(m>5) 
     return true; 
    if(m<5) 
     return false; 

} 

隨着功能,我試圖讓調用這個函數之外定義該功能具有價值內部本地「輸出」價值 - 「長 - 」

我試着做

bool Function(char* inString) 
{ 
int m = strlen(inString); 
    char output[1001]; 
    memset(output , 0 , sizeof(output)); 
    sprintf_s(output,50,"length is %d",m); 
    sprintf_s(inString,50,output); 
    if(m>5) 
      return true; 
     if(m<5) 
      return false; 
} 

但這種失敗,因爲inString早已值,這是給下面的錯誤 訪問衝突寫入位置0x00165267。

有沒有什麼辦法從這個函數(基於字符串長度的bool值)以及b)字符串語句「輸出」獲取這兩個參數?

我很感謝你的幫助..

+1

如果'm == 5'?您的功能不包括所有可能性的退貨。 –

+0

m == 5顯然沒有找到文件:http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx –

+0

如果是C++,請避免C字符串和(通常)指針。 – Roddy

回答

3

你是如何調用這個函數?如果您使用字符串文字來調用它,那麼該字符串文字可能在只讀內存中。例如,這將失敗:

bool result = Function("longer than 5"); 

這很可能會導致訪問衝突,因爲該字符串"longer than 5"很可能在只讀存儲器中。 (它不是必須的,但它可能與現代編譯器一起使用。)

另外,正如Alexandru在上面指出的那樣,您根本沒有處理m == 5的情況。

編輯:如果你想得到你在sprintf_s以外生成的字符串,你有幾個選項。

  1. 您可以添加第二個參數與緩衝區打印字符串。你可以不用在棧上聲明一個緩衝區(你的char output[1001]),而是把這個指針傳給你。即。您的函數原型變爲bool Function(char *inString, char *outString);
  2. 使您的緩衝區爲static,然後通過引用返回指向它的指針。這需要您添加第二個操作數。這一點有點醜陋:bool Function(char *inString, char **outString);然後,在你的代碼中,你會說*outString = output,坦率地說,這很糟糕。
  3. 將輸出緩衝區移至文件範圍數組。這更醜陋。

一個以上#1的優點是,你可以使用默認參數,有一個if語句,使sprintf可選:

bool Function(char *inString, char *outString = 0) 
{ 
    int m = strlen(inString); 

    if (outString) 
     sprintf_s(outString, 50, "length is %d", m); 

    return m >= 5; 
} 

此外,文體注:不想char *inStringchar* inString。在C和C++中,星號不是要聲明的類型的一部分,而是要聲明的單個符號的修飾符。如果要聲明兩個字符指針ab,則需要編寫char *a, *b而不是char* a, b

編輯2:如果你相信約翰·卡馬克的堅持,你const任何可能const,那麼上面就變成了:

bool Function(const char *const inString, char *const outString = 0) 
{ 
    const int m = strlen(inString); 

    if (outString) 
     sprintf_s(outString, 50, "length is %d", m); 

    return m >= 5; 
} 

我想你可以走的更遠,並使其返回const bool,除了函數的返回值已經是一個右值...

+0

'return m> = 5;' – Roddy

+0

是的,大多數編譯器會捕獲並優化它。不過,我會繼續編輯上面的答案。 –

+1

如果你發現一個*不*優化的編譯器,那麼該把編譯器丟掉了。但Roddy的建議不是性能優化,而是可讀性*優化。 –

1

能夠從函數返回一個字符串。即使在退出函數後,仍然需要以這種方式分配字符串。您的示例將字符串存儲在本地數組(output)中,該數組並不超出函數的作用域({ })。

有幾種方法可以做到這一點:

  • 動態分配的內存
  • static存儲

等,使用哪一個取決於您的使用語義。

您只需要將輸出字符串作爲函數參數傳遞。既然你想在函數內部分配字符串,你需要通過引用傳遞一個指針。

在一個側面說明,請考慮使用std::string代替char *

0

由於您使用C++,你應該這樣做

bool Function(std::string &inString, std::string &outString) 
{ 
    size_t size = inString.size(); 
    outString = "length is " + std::to_string(size); //if c++11 
    if (size > 5) 
      return true; 
    return false; 
} 

到您的size_t轉換爲C字符串++,你可以使用boost::lexical_cast或本define

#include <sstream> 
#define SSTR(x) dynamic_cast< std::ostringstream & >((std::ostringstream() << std::dec << x)).str() 

inString = "length is " + SSTR(size); 
0

你的代碼是不是真的C++,這是C.

這裏是你應該怎麼做它在C++。請注意使用引用而不是指針。

bool Function(const std::string &inString, std::string &outString) 
{ 
    int m = inString.size(); 

    std::stringstream ss; 
    ss << "length is" << m; 

    outString = ss.str(); 

    return m >= 5; 
}