2015-05-09 39 views
0

我想写一个数组下标运算符出现在.c文件中的计数器。问题是输入文件可能非常复杂,例如:数组下标运算符的计数

string[0] = 'R'; 
a[1] = 0; 
a[ 1] = 0; 
a[1 ] = 0; 
a[ 1 ] = 0; 
a[1+i] = 0; 
a[ 1+i] = 0; 
a[1+i ] = 0; 
a[ 1+i ] = 0; 
a[ 1 + i ] = 0; 

a[a[0] + a[a[0]+1] + i] = 0; 
a[a[0] + a[a[0]+1] + i] = (int)a[a[a[a[a[(int)i]]]] + i]; 

a = "retezec"[0]; 
a = (p1+p2)[0]; 

multiarray[1][2] [3] [4] 
[5] = 0; 

// int *getArray(int a){ 
// return a; 
// } 

getArray(a)[0] = getArray(a)[1] 
getArray(a)[i+1] = getArray(a)[i+1] 
getArray(
a 
) 
[i+1] = getArray(
a 
) [i+1] 

...其中是36个数组下标操作符。 你有任何想法如何在Python

编辑写:在运营商的声明不能算作,如:

int field[1][a]; //0 operators !! 
field[2][4];  //2 operators 

回答

1

我不知道蟒蛇...

但是你

问题似乎很简单。假设c代码没有错误,你可以只计算'['出现次数。

所以在C++中,它可能看起来像

for (int n=0; n < stringOfText.length(); ++n) 
    if (stringOfText[n] == '[') 
     arraySubscriptOperatorCounter++; 

调整 所以它会满足您的要求(C++,并且不包括获取从文件文本将增加要求

#include <iostream> 

inline size_t findNext (const std::string& s, char c, size_t pos =0, bool reverse =false) { 
    if (reverse) 
     return s.substr(0,pos).rfind(c); 
    else if (!reverse) 
     return s.substr(pos).find(c); 
} 

int main() { 
    std::string s; 
    int opCount(0); 
    for (int n(0); n < s.length(); ++n) { 
     if (s[n] == '[') { 
      size_t prev_sem = findNext(s, ';', (size_t)n, true); 
      size_t prev_equ = findNext(s, '=', (size_t)n, true); 
      size_t next_sem = findNext(s, ';', (size_t)n); 
      size_t next_equ = findNext(s, '=', (size_t)n); 

      if (prev_sem == std::string::npos) 
       prev_sem = 0; 
      if (prev_equ == std::string::npos) 
       prev_equ = 0; 


      if (prev_equ > prev_sem) { 
       opCount++; 
      } 
      else if (next_equ < next_sem && next_equ != std::string::npos) { 
       opCount++; 
      } 
     } 
    } 
    std::cout << opCount; 
} 
+0

检查编辑的问题,在这种情况下,您的解决方案将不起作用 – DRINK

+0

它必须是python吗?(我不能评论这个问题) –

+0

我使用python,但如果你在另一种语言帮助我,它会是很有帮助。 – DRINK

0
>>> open('test.c').read().count('[') 
36 

或更安全:

>>> with open('test.c') as f: f.read().count('[') 
36 

当然不能处理所有情况(例如,如果它在字符串中,则计数[)。您可能想要使用适当的解析器。

+0

检查编辑的问题,在这种情况下,您的解决方案将无法工作 – DRINK

+0

@DRINK在这种情况下,我的“你可能会想要使用合适的解析器。“部分适用。 –