2015-01-10 59 views
0

我正在修补C++(我有COBOL,Perl和PHP背景),而且我正在麻烦分裂一个字符串,以便我可以对每个解析字段进行操作。我相信麻烦在于我对C++如何处理变量缺乏了解。错误:无法在初始化中将'std :: string {aka std :: basic_string <char>}'转换为'char *'

我把文件的内容成功地映射到了一个数组中,我可以在每个完整的行上执行操作(例如搜索/替换文本)。我还发现了一些很好的如何解析字符串的例子。当我尝试将解析示例应用于数组中的字符串时,会发生此问题。

的字符串是通过创建:解析字符串

std::vector<std::string> File_Lines; 
    ifstream file(filename.c_str()); 
    while (file.good()) { 
     getline (file, line, '\n'); 
     string InputLine = string(line); 
     File_Lines.push_back(line); 
    } 

一个工作示例(我在此网站上发现)为:

char myString[] = "The quick brown fox"; 
char *p = strtok(myString, " "); 
while (p) { 
    printf ("Token: %s\n", p); 
    p = strtok(NULL, " "); 
} 

的问题,当我试图养活我的字符串开始到解析的代码。直接喂养它:

char myString[] = File_Lines[array_counter]; 

给“错误:初始化失败,以确定‘的myString’的大小”

如果我尝试使用“的std :: string”转换(如在其他答案建议本网站) :

std::string File_Line; 
File_Line = File_Lines[array_counter]; 
char myString[] = File_Line; 

...我得到同样的错误。

其他答案建议代码调整到:

char *myString = File_Line; 

但只是给了我 “错误:在初始化不能转换 '的std :: string {又名性病:: basic_string的}' 到 '字符*'”

我知道这个问题是由于我自己的无知,但我真的很感谢任何帮助如何将字符串馈入解析器。

另外,如果任何人有任何简单的解释如何在数据类型之间进行转换,这将是很大的。

+0

'char * myString = FileLines [array_counter] .c_str();'将编译。但是你应该知道当FileLines被销毁时(字段超出范围),字符串内容的内存将被释放。 – Inspired

+0

只需坚持使用'std :: vector'和'std :: string'而不是C风格'char *'指针和数组的C++方式。它会让你的生活更轻松。如果你真的想在'std :: vector lines'中出现'char * lines []',你需要自己构造它(复制每个缓冲区)。没有自动转换。 – 5gon12eder

+0

调用[std :: string :: c_str](http://www.cplusplus.com/reference/string/string/c_str/)从'std :: string'中获取'const char *'。使用字符串ctor做相反的事情。 – tux3

回答

2

这应该是罚款:

std::string ThisLine = File_Lines[array_counter]; // make a copy for strtok to mess up 
char *p = strtok(&ThisLine[0], " "); // strtok needs a pointer to the first character 
while (p) { 
    printf ("Token: %s\n", p); 
    p = strtok(NULL, " "); 
} 

不过C++有更好的方法比strtok的记号化。例如,std::strstreamoperator>>(用于空白分隔符)或getline(用于您指定的分隔符)。

+0

已排序。非常感谢。 –

0

使用以下命令:

const char * myString1 = File_Lines[array_counter].c_str(); 
char * myString=const_cast<char*>myString1; 
+1

const char * not char * – tux3

+0

我想他想把指针传递给'strtok',它会尝试写入它。在这种情况下会爆炸。 – Wintermute

+0

“程序不得更改此序列中的任何字符。”然后他必须复制它。 – tux3

相关问题