在c ++中使用sprintf()和sscanf()时出现意外行为?

时间:2011-11-14 13:01:59

标签: c++ linux

我使用sprintf()格式化了一个字符串,如下所示:

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 *如下:

char* varCharPointer = myString.c_str();

我尝试使用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.
}

sscanf()的返回值必须为3,但它给出1.任何人都告诉我上述意外行为的原因是什么? 提前谢谢。

2 个答案:

答案 0 :(得分:0)

scanf和它的变体不起作用。例如,%s只能匹配没有空格的字符串 - 所以它肯定不会在orinal上工作,如果“messageContent”是带空格的字符串的替代,它可能不在ossi1上。

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

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

答案 1 :(得分:0)

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