2015-06-08 34 views
0

我一直在尝试使用strtok函数,但函数每次都会破坏代码。Visual Studio C++中的字符串标记化

下面是部分代码:

if (!strcmp(strtok_s(buf1, " ",NULL), ".model")){ 
     strcpy_s(buf2, strtok_s(NULL, " ",NULL)); 
     charPtr1 = strtok_s(NULL, " ",NULL); 
     if (!strcmp(charPtr1, "PNP")) 
      TtypeBuf = PNP; 
     else if (!strcmp(charPtr1, "NPN")) 
      TtypeBuf = NPN; 
     else if (!strcmp(charPtr1, "NMOS")) 
      TtypeBuf = NMOS; 
     else if (!strcmp(charPtr1, "PMOS")) 
      TtypeBuf = PMOS; 

我不能被称为功能defenition.I只需要得到令牌正确的上下文一个addtitonal输入参数得到strtok_s功能的保持。任何帮助,将不胜感激。

+1

我建议使用'的std :: string',可能还有一个'的std :: stringstream'代替。 –

+2

您应该查看[MSDN上的示例](https://msdn.microsoft.com/en-us/library/ftsafwz3.aspx?f=255&MSPPError=-2147217396)。为上下文传递NULL是不正确的。 –

回答

0

strtok_s的上下文参数存储有关当前解析状态的数据。它的功能和工作原理,你并不需要关心,但如果我没有记错的话,它只是指向最后一个分隔符后的第一个字符的指针。你所需要做的就是提供一个字符指针。

char * contextp; 
if (!strcmp(strtok_s(buf1, " ", &contextp), ".model")){ 
     strcpy_s(buf2, strtok_s(NULL, " ", &contextp)); 
     charPtr1 = strtok_s(NULL, " ", &contextp); 
     if (!strcmp(charPtr1, "PNP")) 
      TtypeBuf = PNP; 
     else if (!strcmp(charPtr1, "NPN")) 
      TtypeBuf = NPN; 
     else if (!strcmp(charPtr1, "NMOS")) 
      TtypeBuf = NMOS; 
     else if (!strcmp(charPtr1, "PMOS")) 
      TtypeBuf = PMOS; 

这可以是字符串和流运营商

std::stringstream in (buf1); 
std::string token; 

if (stream >> token) 
{ 
    if (token == ".mode1") 
    { 
     if (stream >> buf2 >> token) // buf2 should become a string as well. 
     { 
      if (token == "PNP") 
       TtypeBuf = PNP; 
      else if (token == "NPN") 
       TtypeBuf = NPN; 
      else if (token == "NMOS") 
       TtypeBuf = NMOS; 
      else if (token == "PMOS") 
       TtypeBuf = PMOS; 
     } 
    } 
}