2014-11-08 8 views
-1

我想通過C中的一串文本進行搜索,找出文本在兩個不同分隔符之間的位置。我專門尋找/ *和* /之間的評論。我找不到一個函數,它允許我使用2個不同的分隔符,每個分隔符的長度爲2個字符。使用2個不同的分隔符搜索字符串 - C編程

我目前有一個非常長的char [],我需要通過它進行搜索。我能找到的最接近的是strstr來查找「/ *」的第一個出現,然後用「* /」再次使用它。然而,這完全忽略了整個評論,只是給了我「* /」和其他代碼。

char *pch; 
char *pch2; 
pch = strstr(wholeProgramStr, "/*"); 
printf("%s\n",pch); 
pch2 = strstr(pch, "*/"); 
printf("%s\n",pch2); 

任何想法?和「//」和換行符之間的相同問題。沒有一些非常混亂和低效的代碼,我無法找到實現這一點的方法。

+1

您的想法使用'strstr'基本上是好的。你想怎麼處理找到的字符串?你想處理(例如打印)它嗎,你想從原始字符串中刪除它嗎?你可以修改原始字符串(如'strtok')來在註釋之後放置一個終止的空字符嗎?分隔符是否應該包含在找到的字符串中? – 2014-11-08 09:34:09

+0

我基本上需要採取字符串,並能夠計算使用它的字符數量,排除/ * * /。我無法修改輸入。謝謝 – JamesDonnelly 2014-11-08 10:01:15

+1

好的,那麼'pch2 - (pch + 2)'會給你答案,其中'2'是起始分隔符'/ *'或'//'的字符串長度。 (你可能應該在'pch + 2'開始搜索'pch2',以便趕上退化的註釋'/ * /',並檢查它們是否存在,否則你可以通過'NULL'到第二個'strstr '。) – 2014-11-08 10:07:15

回答

2
char *tmp = strdup(wholeProgramStr); /* makes a copy to be writeable */ 
char *pch; 
char *pch2; 

pch = strstr(tmp, "/*"); /* pointer to first occurrence */ 
if (pch) { /* founded */ 
    pch += 2; /* skip "/*" */ 
    pch2 = strstr(pch, "*/"); /* pointer to second occurrence */ 
    if (pch2) { /* founded */ 
     *pch2 = '\0'; /* cut */ 
     printf("%s\n", pch); 
    } 
} 

正如@alk指出,沒有必要重複的字符串,如果你只需要打印結果:

char *pch; 
char *pch2; 

pch = strstr(wholeProgramStr, "/*"); /* pointer to first occurrence */ 
if (pch) { /* founded */ 
    pch += 2; /* skip "/*" */ 
    pch2 = strstr(pch, "*/"); /* pointer to second occurrence */ 
    if (pch2) { /* founded */ 
     printf("%*s\n", pch2 - pch, pch)); 
    } 
} 

編輯:

將如何我再次運行它,直到它到達字符串的末尾?那麼 它可以找到多個評論?

循環,直到你不找兩個分隔符:

char *tmp = wholeProgramStr; 
char *pch; 

while (1) { 
    pch = strstr(tmp, "/*"); /* pointer to first occurrence */ 
    if (pch) { /* founded */ 
     pch += 2; // skip "/*" 
     tmp = strstr(pch, "*/"); /* pointer to second occurrence */ 
     if (tmp) { /* founded */ 
      printf("%*s\n", tmp - pch, pch)); 
      tmp += 2; // skip "*/" 
     } else break; 
    } else break; 
} 
+0

這是完美的。你能解釋一下這裏發生了什麼嗎? – JamesDonnelly 2014-11-08 10:07:46

+0

@JamesDonnelly,編輯 – 2014-11-08 10:10:48

+0

爲什麼重複?你可以使用'...「%* s \ n」,pch2-pch-2,pch)'。只打印出一些評論。 – alk 2014-11-08 10:17:08

3

你的主意,用strstr是好的,但它不會給你一個空結尾的字符串。它通過指針算術給出一個指向字符串開頭和字符串長度的指針。您可以打印字符數組,它是由它的長度在printf限制通過指定的%s格式的寬度:

void str_print_between(const char *str, 
    const char *left, const char *right) 
{ 
    const char *begin, *end; 
    int len; 

    begin = strstr(str, left); 
    if (begin == NULL) return; 
    begin += strlen(left); 

    end = strstr(begin, right); 
    if (end == NULL) return; 

    len = end - begin; 
    printf("'%.*s'\n", len, begin); 
} 

取決於你想做什麼,你便可返回通過指針或開始指針和長度(作爲struct)。有許多strn*函數的作用等同於它們的str*對應函數,但需要額外的最大長度,以便可以使用這些函數進一步處理字符串。

處理行註釋與塊註釋的作用相同,只是與其他分隔符一樣。 (但是這個簡單的解決方案並不關注上下文;例如,它會檢測字符串中或跨字符串的註釋)。

相關問題