2016-08-01 61 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; 
}