2011-11-14 42 views
1

我已经采用的sprintf()如下格式化的字符串:在C++中使用sprintf()和sscanf()时出现意外的行为?

int wValue = 1; 
ostringstream ossi1; 
ossi1 << "messageContent"; 
std::string orinal = "this is la large string \n 
         containin large content separated \n 
         by newline character" 

char buff[50000] = {}; 
    sprintf(buff, "What: %d @ Message: %s @ Detail: %s", wValue, ossi1.str().c_str(), orinal.c_str()); 
std::string myString(buff); 

一些操作 即时得到炭后*如下:

char* varCharPointer = myString.c_str(); 

和我试图使用的sscanf该字符串分开()如下:sscanf的的

int varWhat; 
char* strMesg = NULL; 
char* strCall = NULL; 
if(sscanf(varCharPointer, "What: %d @ Message: %s @ Detail: %s", &varWhat, strMesg, strCall) == 3) 
{ 
     // here tried to print the values of varWhat, strMesg and strCall but 
     // im aunable to print/get that value. 
} 

返回值()必须是3,但它给1.凡告诉我什么是对上述unexpec的原因特德的行为? 在此先感谢。

+0

几乎同一主题的创建4小时回来同一用户:可能的重复【如何获得字符串的总含量?(HTTP:/ /stackoverflow.com/questions/8118834/how-to-get-total-content-of-string) – Nawaz

+0

纳瓦兹主题是相同的,但即时获得意外的结果在上述情况。所以请从上面的问题帮助我。 – BSalunke

+0

你不能使用'scanf'和它的喜欢把字符串变成像这样的未分配的指针。您必须为字符串分配内存,或将它们定义为空数组。如果你使用格式说明符'%as',Linux中的标准库确实有'scanf'的扩展名。 –

回答

0

scanf和它的变体不会那样工作。首先,%s只能匹配没有空格的字符串 - 所以它肯定不会在orinal上工作,如果“messageContent”是一个带空格的字符串的替身,也许不会在ossi1上。

最好使用scanf进行极其简单的解析 - 例如, “%d”在开始时读取一个整数,几乎从不为字符串,除非它们绝对不能包含空格。

最后,您需要制作strMesg和strCall缓冲区 - scanf不分配内存。我很惊讶它没有立即崩溃。

+0

感谢上面的老佛朗哥。我可以在以上场景中使用什么?任何想法? – BSalunke

+0

如果我想解析它,我不会尝试写出这样的文本 - 使用更标准的格式(逗号分隔值 - 或另一个分隔符,XML,JSON,固定长度字段) - 设计用于解析的东西,这对您的数据有意义。然后使用该格式的解析器。 –

0

您需要为strMesg和strCall分配内存,或使用字符数组

相关问题