2014-01-07 61 views
-1

我做了这个小程序来统计一个字符串中有多少'en。它确实有效,但是我收到一个错误,说有堆栈被检测到。我不明白如何解决这个...任何人都可以给我一个小费?堆栈粉碎检测到C

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


int main(int argc, char *argv[]) 
{ 
char s[30]; 
int getal=0, e, n; 
int i = 0; 

gets(s); 

for (; s[i] != '\0'; i++) { 
    e =(s[i] == 'e'); 
    n =(s[i + 1] == 'n'); 

    if (e && n) 
     getal++; 
} 

printf("Het aantal bedraagt: %i", getal); 

return 0; 
} 
+2

是字符串输入你超过29个字符?然后'gets'将愉快地写出超出传递数组范围的方式。有一个原因是'gets'已经从最新的C标准中删除,使用['fgets'](http://en.cppreference.com/w/c/io/fgets)(或['gets_s'](http:而不是.encppreference.com/w/c/io/gets))。 –

+1

http://stackoverflow.com/questions/1345670/stack-smashing-detected可能会帮助你理解问题 – SoulRayder

+0

我修复了一些特别讨厌的缩进问题,所以我们可以从树上看到木头。 – Bathsheba

回答

3

千万不要使用gets(),它很容易发生缓冲区溢出。

使用更安全的替代fgets(),就像这样:

char buf[256]; 

if(fgets(buf, sizeof buf, stdin) != NULL) 
{ 
    /* process string here */ 
} 
+0

哦,我明白了。我将在未来努力与此合作。谢谢!虽然已经解决了问题。 – jib