2012-06-30 70 views
1

我有一个函数可以计算一个文件出现在单词上的次数。现在由于某种原因,它得到堆栈粉碎检测到的错误,我没有看到错误。检测到C堆栈粉碎

下面是代码:

int contar_palabra(const char *nombre_file, const char *palabra){ 

/*variables locales*/ 
FILE *file; 
char buffer[50]; 
int bytes_leidos, contador = 0, comparar, cerrar, i;  

/*Abrimos el archivo para lectura*/ 
file = fopen(nombre_file, "r"); 

/*Verificamos que se haya abierto correctamente*/ 
if (file == NULL){ 
    printf("No se pudo abrir el archivo \n"); 
    perror(nombre_file); 
    exit(EXIT_FAILURE); 
} 

/*Procedemos a contar cuantas veces aparece una palabra*/ 
while (!feof(file)){ 

    bytes_leidos = fscanf(file, "%s", buffer); 

    if (bytes_leidos > 0){ 

    /*Hacemos la comparacion*/ 
    comparar = strcmp(buffer, palabra); 
    if (comparar == 0) 
     contador++; 
    } 
    else if(errno == EOF)  
     printf("Error al leer alguna palabra de %s \n", nombre_file); 
    else if (bytes_leidos == EOF) 
    break; 
} 

cerrar = fclose(file); 

if(cerrar == EOF){ 
    printf("Error: no se pudo cerra el archivo."); 
} 

printf("antes de retornar contador \n"); 
return contador; 

}

我使用的valgrind试图找出错误,和日志文件给了我这个:

==2252== Memcheck, a memory error detector 
    ==2252== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. 
    ==2252== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info 
    ==2252== Command: ./pargrep viejo.txt 
    ==2252== Parent PID: 1756 
    ==2252== 
    ==2252== 
    ==2252== HEAP SUMMARY: 
    ==2252==  in use at exit: 55 bytes in 1 blocks 
    ==2252== total heap usage: 7 allocs, 6 frees, 1,389 bytes allocated 
    ==2252== 
    ==2252== 55 bytes in 1 blocks are still reachable in loss record 1 of 1 
    ==2252== at 0x4026864: malloc (vg_replace_malloc.c:236) 
    ==2252== by 0x40B878B: __libc_message (libc_fatal.c:138) 
    ==2252== by 0x413D09F: __fortify_fail (fortify_fail.c:32) 
    ==2252== by 0x413D049: __stack_chk_fail (stack_chk_fail.c:29) 
    ==2252== by 0x8049142: contar_palabra (in /home/alessandro/OS/Proyecto2/prueba1.0/pargrep) 
    ==2252== by 0x80489D4: main (in /home/alessandro/OS/Proyecto2/prueba1.0/pargrep) 
    ==2252== 
    ==2252== LEAK SUMMARY: 
    ==2252== definitely lost: 0 bytes in 0 blocks 
    ==2252== indirectly lost: 0 bytes in 0 blocks 
    ==2252==  possibly lost: 0 bytes in 0 blocks 
    ==2252== still reachable: 55 bytes in 1 blocks 
    ==2252==   suppressed: 0 bytes in 0 blocks 
    ==2252== 
    ==2252== For counts of detected and suppressed errors, rerun with: -v 
    ==2252== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 8) 

请告诉我奇怪的是,它在返回之前打印消息。 我真的没有看到错误,欣赏帮助。 由于事先

回答

4

使用普通%s作为格式说明fscanf是非常危险的,因为你必须超越这是在你的情况下,只有50个字节的缓冲区结束对写作没有保护。考虑为格式说明符提供一个宽度修饰符,但是当宽度限制达到更复杂时,这将处理精确的计数。

您可能会发现,逐个字符(fgetc)或读取固定缓冲区(fread)以及手动检测分隔符会产生更简单的代码。

+0

是的,这是问题。谢谢!!所以我认为我读的超过了我的50个字符,它给了我一个堆栈溢出。再次感谢! – Alessandroempire