2014-02-28 24 views
1

以下是兩個傳統例程。我無法更改例程聲明。用輸入參數中的std :: string替換char數組到函數

static bool GetString(char * str);  //str is output parameter 
static bool IsStringValid(const char * str); //str is input parameter 

使用呼叫如下

char inputString[1000]; 

GetString(inputString); 

IsStringValid(inputString); 

而不是使用固定的字符數組,我想使用的std :: string作爲輸入。我無法獲得正確的語義(string :: c_str)。

+0

'GetString'和'gets(char *)'一樣卑微,所以我希望那個編寫那個遺留函數的傳統工程師是......歷史。 – WhozCraig

回答

1

隨着IsEmpty它不應該是一個問題:

std::string str = "Some text here"; 
IsEmpty(str.c_str()); 

雖然它是相當無用的,如果你有一個std::string的,那麼你通常只叫str.empty()


雖然其他功能,那很難。原因是它的參數不是const,並且std::string不允許您使用指針修改字符串。

可以可以解決,通過寫一個包裝-函數,它接受一個字符串參考,並具有用於實際GetString呼叫的內部陣列,並使用該陣列初始化傳遞的字符串參考。


包裝的例子:

// Function which "creates" a string from scratch 
void GetString(std::string& str) 
{ 
    char tempstr[4096]; 
    GetString(tempstr); 
    str = tempstr; 
} 

// Function which modifies an existing string 
void ModifyString(std::string& str) 
{ 
    const size_t length = str.size() + 1; 
    char* tempstr = new char[length]; 
    std::copy_n(str.c_str(), tempstr, length); 

    ModifyString(tempstr); 

    str = tempstr; 
    delete[] tempstr; 
} 
+0

對不起,讓你們所有人困惑。 IsEmpty()僅僅是一個示例名稱,它並不檢查空本身 – ontherocks

+0

@ontherocks無關緊要。如果一個函數採用'const char *'參數,你可以像我所示的那樣使用['c_str'](http://en.cppreference.com/w/cpp/string/basic_string/c_str)。 –

+0

那麼,我需要一些包裝器,或者我可以直接使用引用GetString()上的字符串。像'std :: string str; GetString(&str);' – ontherocks

0

不能使用c_str的第一個功能,因爲它返回一個const char*。您可以通過引用傳遞std::string並分配給它。至於是空的,你可以在你的字符串上打c_str,但你最好打電話給成員empty()

+0

的唯一原因對不起,讓你們所有人感到困惑。 IsEmpty()只是一個示例名稱,它本身不檢查是否爲空 – ontherocks

0

我想你可以使用STL(標準模板庫)的字符串容器。

#include <string> 
    bool isempty (int x) { 
    return (x == 0) ? true : false ;  
    } 
    // inside main() 

    string s ; 
    cin >> s ; // or getline (cin , s) ; 
    bool empty = isEmpty (s.length()) ; 
0

std::string具有c_str(),您可以使用IsEmpty。沒有函數給你一個非const指針。由於std :: string的分配不能保證是連續的,所以你也不能做類似&s[0]的事情。你可以做的唯一事情就是像你在你的例子中那樣使用一個臨時字符緩衝區。

std::string s; 
char inputString[1000]; 
std::vector<char> v(1000); 

GetString(inputString); 
GetString(&v[0]); 

s = &v[0]; 
IsEmpty(s.c_str()); 
+0

在C++ 11中,字符串保證是連續的,並且仍然沒有對元素的直接可修改訪問。而且'std :: string'的所有實現我都看到過使用連續分配。 –

+0

@DavidRodríguez-dribeas哦,我不知道這一點。但是當它是連續的,爲什麼我不能像'vector'一樣修改訪問權限? – hansmaad

+0

我應該更加明確,沒有辦法直接獲取指向可修改數據的指針,儘管你仍然可以執行'&str [0]'。爲什麼?我不在那裏,但這就是標準所說的。 –

相關問題