Liny_@NotePad

沉迷ACG中

字符串拷贝(Pending)

YOYO posted @ 2009年10月26日 19:31 in 【ICPC】解题报告 with tags 模拟 , 2450 阅读

前几天写DBOp的时候,同桌告诉俺用strcpy_s会比较安全,瞬间想起了当年校赛的这题。。于是挑战之~

虽然oj上是wa的(题目要求变量可定义于任何位置,这段代码只考虑变量定义于strcpy之前 如果想AC请自己注意这点^^),但是。。额觉得额比较符合常理。。 遂贴出纪念:

其实只有五种语句(函数名,{,},char,strcpy),对其分别进行处理即可~(我只会模拟啊模拟 = =)

题目要求有变量作用域,因此用了个栈来存储,为了判断变量是否在当前作用域,存储类型是一对pair<int,string>,int存当前{个数,string存size大小~如果遇到},则当前layer=pair.first的栈顶都出栈~

  1. #include <iostream>
  2. #include <map>
  3. #include <stack>
  4. #include <string>
  5. using namespace std;
  6.  
  7. typedef pair<int, string> SIZE_PAR;
  8. typedef stack<SIZE_PAR> SIZE_STK;
  9. typedef map<string, SIZE_STK>   VARSIZE_MAP;
  10.  
  11. string getVarName(char* pszLine, int* pnSizePos = NULL)
  12. {
  13.         char szName[100];
  14.         int i = 0;
  15.         while (pszLine[i] != '[' && pszLine[i] != ',') {
  16.                 szName[i] = pszLine[i];
  17.                 ++i;
  18.         }
  19.         szName[i] = '\0';
  20.  
  21.         if (NULL != pnSizePos)
  22.         {
  23.                 *pnSizePos = i + 1;
  24.         }
  25.  
  26.         return string(szName);
  27. }
  28.  
  29. string getVarSize(char* pszLine)
  30. {
  31.         char szName[100];
  32.         int i = 0;
  33.         while (pszLine[i] != ']')
  34.         {
  35.                 szName[i] = pszLine[i];
  36.                 ++i;
  37.         }
  38.         szName[i] = '\0';
  39.         return string(szName);
  40. }
  41.  
  42. int main(void)
  43. {
  44.         VARSIZE_MAP     mapVarSize;
  45.         int          nLayer = 0;
  46.  
  47.         char    szLine[100];
  48.         int          nSizePos;
  49.  
  50.         string  strVarName;
  51.         string  strVarSize;
  52.  
  53.         int          t, i;
  54.         char*   p;
  55.  
  56.         while (gets(szLine))
  57.         {
  58.                 p = szLine;
  59.                 while (strstr(p, "{") != NULL)
  60.                 {
  61.                         ++p;
  62.                         ++nLayer;
  63.                 }
  64.                
  65.                 p = szLine;
  66.                 while (strstr(p, "}") != NULL)
  67.                 {
  68.                         for (VARSIZE_MAP::iterator mpit = mapVarSize.begin(); mpit != mapVarSize.end(); ++mpit)
  69.                         {
  70.                                 while (!mpit->second.empty())
  71.                                 {
  72.                                         if (mpit->second.top().first != nLayer) break;
  73.                                         mpit->second.pop();
  74.                                 }
  75.                         }
  76.  
  77.                         ++p;
  78.                         --nLayer;
  79.                 }
  80.  
  81.                 //      strcpy to strcpy_s
  82.                 p = strstr(szLine, "strcpy(");
  83.                 if (p != NULL)
  84.                 {
  85.                         t = p - szLine;
  86.  
  87.                         strVarName = getVarName(p + 7);
  88.                        
  89.                         strVarSize = mapVarSize[strVarName].top().second;
  90.                        
  91.                         for (i = 0; i < t; ++i)
  92.                         {
  93.                                 putchar(szLine[i]);
  94.                         }
  95.  
  96.                         if (strstr(szLine, "\"\"") == NULL)
  97.                         {
  98.                                 printf("strncpy(%s, %s, """, strVarName.c_str(), strVarSize.c_str());
  99.                                 p = strstr(szLine, ", ");
  100.                                
  101.                                 i = 2;
  102.                                 while (p[i] != ')')
  103.                                 {
  104.                                         putchar(p[i]);
  105.                                         ++i;
  106.                                 }
  107.  
  108.                                 printf(""");\n");
  109.  
  110.                                 for (i = 0; i < t; ++i)
  111.                                 {
  112.                                         putchar(szLine[i]);
  113.                                 }
  114.                                
  115.                                 if (strVarSize[0] >= '0' && strVarSize[0] <= '9')
  116.                                 {
  117.                                         nSizePos = atoi(strVarSize.c_str());
  118.                                         printf("%s[%d] = 0;\n", strVarName.c_str(), nSizePos - 1);
  119.                                 }
  120.                                 else
  121.                                 {
  122.                                         printf("%s[%s - 1] = 0;\n", strVarName.c_str(), strVarSize.c_str());
  123.                                 }
  124.                         }
  125.                         else
  126.                         {
  127.                                 printf("%s[0] = 0;\n", strVarName.c_str());
  128.                         }
  129.  
  130.                         continue;
  131.                 }
  132.  
  133.                 //      get vars' name and size
  134.                 p = strstr(szLine, "char ");
  135.                 if (p != NULL)
  136.                 {
  137.                         strVarName = getVarName(p + 5, &nSizePos);
  138.  
  139.                         if (mapVarSize.find(strVarName) == mapVarSize.end())
  140.                         {
  141.                                 mapVarSize[strVarName] = *new SIZE_STK;
  142.                         }
  143.  
  144.                         mapVarSize[strVarName].push(make_pair(nLayer, getVarSize(p + 5 + nSizePos)));
  145.                 }
  146.  
  147.                 //      puts normal
  148.                 puts(szLine);
  149.         }
  150.  
  151.         return 0;
  152. }

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter