2012-04-25 136 views
0

對於聲明爲char * 輸出參數的任何函數,是否有指定std :: string的「char」部分的方法作爲函數的輸出?如何使用std :: string作爲char *輸出參數

我開始:

// EDIT: ADDED THESE TWO LINES FOR CLARITY 

sprintf(buf, "top -n 1 -p %s" , commaSeparatedListOfPIDs.c_str()); 
fp = popen(buf, "r"); 

std::string replyStr; 
char   reply[100]; 

rc = scanf(fp, "%s", reply); 
replyStr = reply; 

,但似乎有點,好,笨拙。

那麼,有沒有辦法說:

rc = scanf(fp, "%s", &replyStr.c_str()); 

或類似的東西?

謝謝!

+0

[std :: string :: operator \ [\]的結果的地址是否指向可寫,nul結尾的緩衝區?](http://stackoverflow.com/questions/9728450/does stdstringoperator-address-of-the-stdstringoperator-point-to-a-writable -n) – ildjarn 2012-04-25 23:23:36

+0

我看到我錯過了一個重要的觀點,fd是來自popen()。 – 2012-04-26 00:09:26

回答

2

是的,這是可能的:

std::string replyStr(100, '\0'); 
//Requires C++11 (to guarantee that strings hold their characters 
//in contiguous memory), and some way to ensure that the string in the file 
//is less than 100 characters long. 
rc = fscanf(fp, "%s", &reply.front()); 
replyStr.erase(replyStr.find('\0')); 

第二個條件是很難滿足的,如果很不滿意這個方案不確定的行爲。

+0

在我的情況下,因爲我從**頂部**偷,我知道最大線尺寸<100。 – 2012-04-26 11:37:24

+0

男孩是我錯了。從** man top **:頂部顯示屏的寬度將限制在512個位置。顯示所有字段至少需要160個字符。剩餘的寬度可以用於'Command'列。 c/100/512/ – 2012-04-26 11:50:16

0

如果你想使用字符串,爲什麼不使用C++的I/O方式呢?看看this link

+0

也許是因爲[他喜歡錶演?](http://stackoverflow.com/q/4340396/734069) – 2012-04-25 23:33:21

+1

也許 - 只是看起來我們不在這個聯盟這裏 – Mads 2012-04-25 23:34:52

0

std::string replyStr(reply);將使你的char數組的字符串。

編輯:

但是......沒有什麼不同。

使用C++ style in/out不必使用char*

cin >> replyStr;將得到下一個字符串,直到空白爲止。 getline(cin,reply);將字符串設定爲輸入的整條生產線

+2

與'replyStr = reply; ,他已經擁有了? OP想要擺脫'reply'完全... – ildjarn 2012-04-25 23:29:42

+0

忘記'='操作符重載字符串到char *,將編輯我的回覆 – 2012-04-25 23:33:09

1

直到C++ 0x,& str [0]不需要返回指向連續存儲的指針。傳統的方法是使用std ::載體,其保證具有連之前的C++ 0x相連存儲:

std::vector<char> reply(100); 
rc = scanf(fp, "%s", &reply[0]); 

C++ 0x中,然而,的std :: string也保證工作而不是std :: vector。

+0

但std :: vector不會像std :: string那樣擁有所有這些子字符串和大小以及其他任何屬性。這些方法適用於收集,而不是收集。 – 2012-04-26 11:35:40

0

只要字符串有效,來自std :: String的char *就是有效的。如果std :: String超出範圍,那麼它不再是一個有效的字符指針。

const char* bar; 
{ 
    std::String foo = "Hello"; 
    bar = foo.c_str(); 
    printf("%s", bar); //SAFE since the String foo is still in scope 
} 
printf("%s", bar); //UNSAFE String foo is no longer in scope 

只要的std :: string變量存在,你可以使用爲const char *如果超出範圍內存被釋放,爲const char *指針變成懸掛指針不再是安全的使用。

,如果你需要它的std :: string富之後,這些已經超出範圍,則必須將字符串複製到一個char *

char bar[100]; 
{ 
    std::String foo = "Hello"; 
    strncpy(bar, foo.c_str(), 100); 
    bar[100] = '\0'; //make sure string is null-terminated 
    printf("%s", bar); //SAFE 
} 
printf("%s", bar); //SAFE even though the std::String has gone out of scope. 

如果字符串是一個函數裏面會不會存在函數返回時。

+0

對不起,但這裏是foo這個函數的輸入。我希望foo作爲輸出。參數是變量的地址,以便函數可以回覆該變量。 – 2012-04-26 11:33:20

相關問題