2009-10-07 31 views
1

我們有一個函數最長的,它返回由字母組成的最長的子字符串。例如:C - If/Else和指針返回錯誤的字符串

longest("112****hel 5454lllllo454") 

將返回:lllllo

然而,當我運行程序似乎回到lllllo454。這裏是功能:

char *longest(char *s){ 
    char *pMax = NULL; 
    int nMax = 0; 
    char *p = NULL; 
    int n = 0; 
    int inside = 0; //flag 
    while(*s!='\0'){ 
     char c = *s; 
     if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')){ 
      if(inside == 0){ 
       n = 1; 
       p = s; 
       inside = 1; 
      } 
      else 
       n++; 
      if(inside == 1){ 
       if(n > nMax){ 
        nMax = n; 
        pMax = p; 
        inside = 0; 
       } 
      } 
     }//end isLetter if 
     s++; 
    } 
    return pMax; 
} 

有什麼我沒有看到這裏...你們怎麼看?

回答

6

您只是返回指向最長子字符串中第一個字符的指針。實際上,在子字符串結束後不添加字符串終止符,因此它會一直延續到原始字符串的末尾。您可能應該將子字符串(僅序列中的那些字符)複製到新字符串並返回指向該字符串的指針。

char* newStr = malloc(nMax+1); 
strncpy(newStr, pMax, nMax); 
*(newStr+nMax) = '\0'; 
return newStr; 
+1

或者將「int * nMax」作爲輸出參數。如果是這樣,最好在分配給* nMax之前進行空檢查 - 這是一個常見的「我不需要」的慣例。 – Steve314 2009-10-07 02:30:31

3

您正在計算nMax,但沒有對該信息做任何處理。在C中,char*指向由NUL字符終止的一串字符的開始。由於您沒有修改傳遞給函數的緩衝區,所返回的指針指向第一個「l」並繼續到原始字符串的末尾。

0

這會返回一個字符串啓動最大子。該函數的那臺inside,如下部分:如果c是字母

if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')){

纔會執行。既然你想最大的子串包括一封信,你需要這是:

if(c != ' '){

然後,循環內部,有另一個變量,說containsLetter,如果你遇到一個字母是唯一的真在另一空間之前。