2013-12-22 35 views
-1

我一直在編寫一個代碼,在C語言的#include語句的末尾插入新行字符('\ n')。新行字符覆蓋下列字節​​

前) [前]

#include <stdio.h> #include <stdlib.h> 

[AFTER]

#include <stdio.h> 
#include <stdlib.h> 

所以我得爲此做了一個功能。變量'raw'代表原始數據的字符串緩衝區,idx是通過字符串變量'raw'移動的索引變量。

def insert(raw, idx, new): # inserts string(new) to the original string(raw). Location of insertion can be specified by variable idx. 

    return raw[:idx] + new + raw[idx:] 

用上面的功能,我也寫過這樣的代碼:

includeFlag1 = False # be ready to detect '<' of the include statement. 
includeFlag2 = False # Turned on when the '<' is detected. Turned off when the include statement ends. 
elif raw[idx:idx+8] == '#include' : # include statement is detected. 

      includeFlag1 = True 

elif raw[idx] == '<' and includeFlag1 == True: 

      includeFlag2 = True 

elif raw[idx] == '>' and includeFlag1 == True: 

      raw = insert(raw, idx+1, '\n') # adds the new-line charcter at the end of the include statement. 
      includeFlag2 = False  # the include statement has just ended. 
      includeFlag1 = False  
      idx = idx + 1 

真正的問題是,當我運行上面的代碼,新行字符覆蓋的「#」字符,這是'#include <>'語句的起點。 欲瞭解更多信息,請查看下面的調試日誌。 日誌記錄如下: raw [idx] [icdFlag] includeFlag1 includeFlag2

============================ =======================================

# [icdFlag] False False 
i [icdFlag] True False 
n [icdFlag] True False 
c [icdFlag] True False 
l [icdFlag] True False 
u [icdFlag] True False 
d [icdFlag] True False 
e [icdFlag] True False 
    [icdFlag] True False 
< [icdFlag] True False 
s [icdFlag] True True 
t [icdFlag] True True 
d [icdFlag] True True 
i [icdFlag] True True 
o [icdFlag] True True 
. [icdFlag] True True 
h [icdFlag] True True 
> [icdFlag] True True 

[icdFlag] False False 
i [icdFlag] False False 
n [icdFlag] False False 
c [icdFlag] False False 
l [icdFlag] False False 
u [icdFlag] False False 
d [icdFlag] False False 
e [icdFlag] False False 
    [icdFlag] False False 
< [icdFlag] False False 
s [icdFlag] False False 
t [icdFlag] False False 
d [icdFlag] False False 
l [icdFlag] False False 
i [icdFlag] False False 
b [icdFlag] False False 
. [icdFlag] False False 
h [icdFlag] False False 
> [icdFlag] False False 
# [icdFlag] False False 
i [icdFlag] True False 
n [icdFlag] True False 
c [icdFlag] True False 
l [icdFlag] True False 
u [icdFlag] True False 
d [icdFlag] True False 
e [icdFlag] True False 
    [icdFlag] True False 
< [icdFlag] True False 
s [icdFlag] True True 
t [icdFlag] True True 
r [icdFlag] True True 
i [icdFlag] True True 
n [icdFlag] True True 
g [icdFlag] True True 
. [icdFlag] True True 
h [icdFlag] True True 
> [icdFlag] True True 

[icdFlag] False False 
i [icdFlag] False False 
n [icdFlag] False False 
c [icdFlag] False False 
l [icdFlag] False False 
u [icdFlag] False False 
d [icdFlag] False False 
e [icdFlag] False False 
    [icdFlag] False False 
< [icdFlag] False False 
t [icdFlag] False False 
i [icdFlag] False False 
m [icdFlag] False False 
e [icdFlag] False False 
. [icdFlag] False False 
h [icdFlag] False False 
> [icdFlag] False False 
v [icdFlag] False False 
o [icdFlag] False False 
i [icdFlag] False False 
d [icdFlag] False False 
    [icdFlag] False False 
g [icdFlag] False False 
e [icdFlag] False False 
t [icdFlag] False False 
_ [icdFlag] False False 
u [icdFlag] False False 
s [icdFlag] False False 
e [icdFlag] False False 
r [icdFlag] False False 
_ [icdFlag] False False 
i [icdFlag] False False 
n [icdFlag] False False 
f [icdFlag] False False 
o [icdFlag] False False 
( [icdFlag] False False 
c [icdFlag] False False 
h [icdFlag] False False 
a [icdFlag] False False 
r [icdFlag] False False 
    [icdFlag] False False 

* [icdFlag] False False

當然,我已經檢查過原始C源代碼是不是缺少'#'字符,但它沒有。我想知道爲什麼會發生這種事情。

+1

您的插入功能似乎適用於我。你確定沒有什麼東西在你的其他代碼中搞亂了嗎?raw = insert(raw,idx + 1,'\ n')'?請顯示您通過'idx'完成的整個循環的結構,以及最後使用'raw'處理的內容。 – Blckknght

回答

0

也許這樣?

#!/usr/bin/env python 
my_code = """ 
# Other stuff 
#include <stdio.h> #include <stdlib.h> #include <other.h> 
# Other stuff 
""" 
import os 
import re 
for line in my_code.splitlines(): 
    include_list = re.findall(r"include <\w+\.h>", line) 
    if include_list: 
     print(os.linesep.join(include_list)) 
    else: 
     print(line) 
1

我可能只是將它分解成行並由「include」分割。

processedLines = [] # put into an array 
lines = raw.split('\n') 
for line in lines: 
    if "#include" in line: 
     includes = line.split("#include ") # "#include <foo.h> #include <bar.h>" becomes ["", "<foo.h>", "<bar.h>"] 
     for include in includes[1:] # skip the blank at the beginning 
      processedLines.append("#include " + include) 
    else 
     processedLines.append(line)