2016-08-01 59 views
0
#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    char str[] = "my name is khan. and i am not a terrorist\n"; 
    char arr[80]; 
    char wolf[] = { 'a', 'e', 'i', 'o', 'u', '\0' }; 
    int i, j, k, len; 

    len = strlen(str); 
    for (i = 0, j = 0; i < len; i++) { 
     for (k = 0; k <= 4; k++) { 
      if (wolf[k] != str[i]) { 
       arr[j] = str[i]; 
       j++; 
      } 
     } 
    } 
    return 0; 
} 

在這裏,我必須從字符串str中刪除元音。我將結果字符串存儲在arr中。但是,每當我執行它時,堆棧粉碎錯誤就會出現。爲什麼?從字符串中刪除元音字符串堆棧粉碎錯誤

+2

'如果(狼[K] = STR [1]!)':條件不匹配時,不必全部。例如[this](http://ideone.com/IM5k7t) – BLUEPIXY

+0

@NamanSharma:您可以點擊其分數下面的灰色複選標記來接受其中一個答案。 – chqrlie

回答

2

處理char m時會發生什麼?

你會寫5次到arr。一般來說,所有的字符將被寫入4或5次。

不要在內部循環中寫入arr。而是用一面旗子來記住你是否有一場比賽。在循環之後測試標誌以查看char是否被寫入。

1

你在檢查中有錯誤,如果字符不是元音,則你複製5次相同的字符。你應該讓你的支票以這種方式

for(i=0,j=0;i<len;i++) 
{ 
    unsigned char isvowel = 0; 
    for(k=0;k<=4;k++) 
    { 
     if(wolf[k]==str[i]) 
     { 
      isvowel = 1; 
      break; 
     } 
    } 
    if (!isvowel) { 
     arr[j]=str[i]; 
     j++; 
    } 
} 

,或者你可以開發一個單獨的功能,以檢查是否charachter是元音:

unsigned char isvowel(char c) 
{ 
    char wolf[]={'a','e','i','o','u','\0'}; 
    int k; 
    for(k=0;k<=4;k++) 
    { 
     if(wolf[k]==c) 
     { 
      return 1; 
     } 
    } 
    return 0; 
} 

你可以以這種方式使用它在你的for循環:

for(i=0,j=0;i<len;i++) 
{ 
    if (!isvowel(str[i]) { 
     arr[j]=str[i]; 
     j++; 
    } 
} 

順便說,你必須在你的arr字符串末尾添加空charachter。 for循環後添加下面的行:

arr[j] = '\0'; 
1

由於大量的比較正在進行,您正在獲得緩衝區溢出(可能)。這部分代碼:

if(wolf[k]!=str[i]){ 
    arr[j]=str[i]; 
    j++; 
} 

似乎改變j的值,每次都有不匹配。例如,讓我們說第一個字符'm',最終會在'arr'數組中被複制多次。

0

Stack smashing表示您正在非法使用堆棧(計算機內存的一部分)。堆棧內存的非法使用可以通過多種方式完成。一種方法是向數組添加更多的元素而不是其容量。例如,如果您嘗試將15個元素添加到容量爲10個元素的數組中,那麼您將擁有stack smashing

這裏你的情況,數組char arr[80];80字符的容量,但是你在這個數組中添加了超過80個字符。這就是爲什麼你得到stack smashing錯誤。

你的代碼有兩個問題。首先,您將以上的元素添加到arr[]以上。

/* Issue 1 */ 
    for(k=0;k<=4;k++) 
    { 
     if(wolf[k]!=str[i]) 
     { 
      /* You are adding str[i] to 
       arr[] multiple times 
      */ 
      arr[j]=str[i]; 
      j++; 
     } 
    } 

這裏您比較str[i]每個元音的性格和補充說,性格arr[]每次。這樣每個字符加5次(非元音字母)或4次(元音字符)。

要解決此問題,您需要將str[i]與所有元音進行比較,並且只有在與任何元音不匹配時纔將其添加到arr[]。有很多方法可以做到這一點。例如,您可以使用附加變量作爲標誌。

其次,您不檢查arr[]是否有剩餘空間添加任何新字符。在您的這部分代碼:

/* Issue 2: You are not checking if space left in arr[] */ 
for(i=0,j=0;i<len;i++) 
{ 

在這裏,你的循環條件,你需要確保有留在ARR []空間。所以,你需要在for循環中增加一個條件。

這是一個解決方案(多間):

/* Check if space left in arr, i.e. j < 80 */ 
for(i=0,j=0;i<len && j < 80;i++) 
{ 
    /* Add a flag: 
     1 means vowel 
     0 means not a vowel 
    */ 
    int v_flag = 0; 

    for(k=0;k<=4;k++) 
    { 
     if(wolf[k] == str[i]) 
     { 
      v_flag = 1; /* Indicate that this is vowel */ 
      break; 
     } 
    } 
    /* Add to arr[] only if not a vowel */ 
    if (v_flag == 0) 
    { 
     arr[j] = str[i]; 
     j++; 
    } 
} 
/* Null terminate the string */ 
arr[j] = '\0'; 
0

我修改你的代碼稍加改動與flag,並在結束時,你錯過了arr[j]='\0';

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main() 
{ 
char str[]="my name is khan. and i am not a terrorist"; 
char arr[80]={0}; 
char wolf[]={'a','e','i','o','u','\0'}; 
int i,j,k,len,flag=0; 
len=strlen(str); 
for(i=0,j=0;i<len;i++) 
{ 
    for(k=0;k<=4;k++) 
    { 
     if(wolf[k]==str[i]) 
     { 
      flag = 1; 
      break; 
     } 
    } 
    if(0==flag) 
    { 
     arr[j]=str[i]; 
     j++; 
    } 
flag=0;  
} 
arr[j]='\0'; 
printf("str:%s\n",str); 
printf("arr:%s\n",arr); 
return 0; 
} 

這可能是同樣的想法以前的答案。

0

有標準庫中一些字符串函數,可以幫助你,和strchr()是(你可以擺脫內環的!)其中之一:

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

int main() 
{ 
    char str[] = "my name is khan. and i am not a terrorist\n"; 
    char arr[80]; 
    char *wolf = "aeiouy"; 
    int i,j; 
    for(i=j=0; arr[j] = str[i]; i++) 
    { 
      if (!strchr (wolf, str[i])) j++; 
    } 
    printf("%s\n", arr); 
    return 0; 
} 
0

你實際上是複製的字符從str每個失敗的比較元音。由此產生的字符串在4之間,比原來的長長5倍,比目標數組arr長得多。超出數組末尾的寫入會調用未定義的行爲:在您的情況下,提前終止程序。

這裏是如何解決您的問題:

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

int main() { 
    char str[] = "my name is khan. and i am not a terrorist\n"; 
    char arr[80]; 
    char wolf[] = { 'a', 'e', 'i', 'o', 'u', '\0' }; 
    int i, j, k, len; 

    len = strlen(str); 
    for (i = 0, j = 0; i < len; i++) { 
     for (k = 0; k < 5; k++) { 
      if (str[i] == wolf[k]) 
       break; 
     } 
     if (k == 5) { // not a vowel 
      arr[j] = str[i]; 
      j++; 
     } 
    } 
    arr[j] = '\0'; // remember to put the final null byte to close the C string 

    printf("result: %s\n", arr); 
    return 0; 
}