2

重複の可能性:
std::stringでstrtokを使用する

#include<iostream>
#include <string>
#include <string.h>

using namespace std;

int main()
{
    string s("hello hi here whola");
    string background;
    char *strval;

    char* tok = strtok_r(s.c_str()," ",&strval);
    while(tok !=NULL)
    {
    cout << tok <<"\n";
    if (tok == "&")
        background = tok;
    else
    {
        statements1;
        statement2.. ;
    }
    tok = strtok_r(NULL, " ",&strval);
    }

    return 0;
}

出力:

new.cpp: In function ‘int main()’:
new.cpp:13:47: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
/usr/include/string.h:359:14: error:   initializing argument 1 of ‘char* strtok_r(char*, const char*, char**)’ [-fpermissive]
4

3 に答える 3

10

は const char へのs.c_str()ポインタを返し、バックアップ メモリを変更できないようにします。トークンをスキャンしている文字列を実際に変更するため、strdup()関数を使用して、この定数文字列の書き込み可能なコピーを作成する必要があります。strtok()

于 2012-10-13T14:46:50.470 に答える
1

strtokその引数を変更します。const char*string.c_str()であるため、これは使用できません

また、たとえそれが機能したとしてもif( tok == "&" )、 tok は文字列ではなく char* であるため機能しません。したがって、コンテンツ比較ではなくポインターを実行することになります。

使用する必要がありますstrcmp()

文字列を使用しているので、壊れて他の C++ 構造を使用してみませんか?

stringstream ss(s);
string tmp; 
while (ss >> buf) {
    if( buf == "&" ) background = buf; // one wonders why
    cout << buf << '\n';
}
于 2012-10-13T14:47:46.460 に答える
0

あなたのコードは C++stringcoutを Cstrtok_r関数と混合しています。それは良い組み合わせではありません。

エラーの直接の原因は、c_str()a const char *whilestrtok()が非 const を要求することchar *です。引数として渡す文字列を変更したいのですが、返される文字列を変更することはできませんc_str()

この C スタイルを実行する場合はschar[].

char s[] = "hello hi here whola";
int background = 0;
char *strval;

char* tok = strtok_r(s, " ", &strval);
while (tok != NULL)
{
    printf("%s\n", tok);

    if (strcmp(tok, "&") == 0)
        background = 1;
    else
    {
        statement1;
        statement2;
        ...
    }

    tok = strtok_r(NULL, " ", &strval);
}
于 2012-10-13T14:48:27.860 に答える