0

char *出力パラメーターを受け取るように宣言されている関数の場合、関数の出力としてs 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() );

またはそのようなもの?

ありがとう!

4

5 に答える 5

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'));

2番目の条件は満たすのが非常に難しく、満たされない場合、このプログラムの動作は未定義です。

于 2012-04-25T23:35:28.350 に答える
1

c ++ 0xまでは、連続したストレージへのポインターを返すために&str[0]は必要ありませんでした。従来の方法は、std :: vectorを使用することです。これは、c++0xの前でも連続したストレージを持つことが保証されています。

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

ただし、c ++ 0xでは、std::vectorの代わりにstd::stringも機能することが保証されています。

于 2012-04-25T23:45:54.343 に答える
0

std ::Stringからのchar*は、文字列が有効である場合にのみ有効です。std :: Stringがスコープ外になると、それは有効なcharポインタではなくなります。

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 fooがスコープ外になった後に存在する必要がある場合は、文字列を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.

文字列が関数内にある場合、関数が戻ったときに文字列は存在しません。

于 2012-04-25T23:46:58.920 に答える
0

文字列を使用したい場合は、C++のi/oも使用してみませんか?このリンクを見てください

于 2012-04-25T23:28:17.680 に答える
0

std::string replyStr(reply);char配列の文字列を作成します。

編集:

しかし...それは何も変わりません。

を使用する必要がないようにするには、c++スタイルのin/outを使用しますchar*

cin >> replyStr;空白になるまで次の文字列を取得します。 getline(cin,reply);文字列を入力行全体に設定します

于 2012-04-25T23:28:25.007 に答える