2013-11-16 4 views
0

Этот код имеет странное поведение в процедуре «check_connected». Параметр преобразуется в char [30] перед использованием функции strncmp, если нет, результатом является «переполнение стека». Проблема возникает в результате сравнения двух строк, «Le solteria rige el corason ..» -> это параметр «La solteria rige el corazon ...» -> это сохраняется в списке Результат равен 0. Я понимаю, что strncmp сравнивает весь характер строк и по здравому смыслу результат не должен быть равен нулю.странное поведение strncmp

#include <string.h> 
#include <stdio.h> 
#define LONGITUD_USUARIO 30 
//estructuras de socorro 
typedef struct nodo_list{ 
    char id_usuario[LONGITUD_USUARIO]; 
    struct nodo_list *siguiente; 
} nodo; 
//definiciones 
#define TRUE 1 
#define FALSE 0 
//variables 
nodo *headlist; 
int size_var; 
//declaracion de metodos 
void initialize_list(); 
int add_connected(char *id_usuario); 
int check_connected(char *id_usuario); 
int disconnect(char *id_usuario); 
int isEmpty(); 
int size(); 
//implementacion de metodos 
/* 
    Dado un id usuario lo incorpora al principio de la lista 
*/ 
int add_connected(char *id_usuario){ 
    nodo nuevoNodo; 
    strcpy(nuevoNodo.id_usuario, id_usuario); 
    nuevoNodo.siguiente = headlist; 
    headlist = &nuevoNodo; 
    size_var++; 
    return TRUE; 
} 
int check_connected(char *id_usuario){ 
    nodo *cursor = headlist; 
    char id_user[LONGITUD_USUARIO]; 
    sprintf(id_user,"%s",id_usuario); 
    printf(" ----> %d \n",strncmp(cursor->id_usuario, id_user,LONGITUD_USUARIO)); 
    if(!isEmpty()){ 
     while(cursor != NULL && (strncmp(cursor->id_usuario, id_user,LONGITUD_USUARIO) != 0)){ 
      printf(" ----> %d \n",strncmp(cursor->id_usuario, id_user,LONGITUD_USUARIO)); 
      cursor = cursor->siguiente; 
     }} 
    return cursor != NULL ; 
} 
int disconnect(char *id_usuario){ 
    nodo *cursor = headlist, *anterior = NULL; 
    char id_user[LONGITUD_USUARIO]; 
    sprintf(id_user,"%s",id_usuario); 
    if(!isEmpty()){ 
     while(cursor != NULL && strncmp(cursor->id_usuario, id_user, LONGITUD_USUARIO) != 0){ 
      anterior = cursor; 
      cursor = cursor->siguiente; 
     } 
     if(anterior == NULL){ // es el primero 
      headlist = cursor->siguiente; 
      size_var--; 
      return TRUE; 
     } 
     else 
      if(cursor != NULL){ 
       anterior->siguiente = cursor->siguiente; 
       size_var--; 
       return TRUE; 
      } 
    } 
    return FALSE; 
} 
void initialize_list(){ 
    headlist = NULL; 
    size_var = 0; 
} 
int size(){ 
    return size_var; 
} 
int isEmpty(){ 
    return size() == 0; 
} 
void tester_list(){ 
    initialize_list(); 
    printf("Inicializo\n"); 
    if(add_connected("Betina la corbina")) 
     printf("Agrego a Betina\n"); 
    if(add_connected("CREO EN LA REENCARNACIÓN...(LA UÑA)")) 
     printf("Agrego a la uña\n"); 
    if(add_connected("La solteria rige el corazon...")) 
     printf("Agrego a la solteria\n"); 
    printf("ZISE --> %d \n",size()); 
    if(check_connected("Le solteria rige el corason..")) 
     printf("Cualquiera se mando\n"); 
    if(check_connected("La solteria rige el corazon...")) 
     printf("verifico correctamente solteria\n"); 
    if(disconnect("La solteria rige el corazon...")) 
     printf("verifico correctamente solteria\n"); 
    printf("ZISE --> %d \n",size());  
    if(add_connected("Todos los perros van al cielo...")) 
     printf("Agrego a perros\n"); 
    printf("ZISE --> %d \n",size());  
} 
void main(){ 
    tester_list(); 
} 
+1

Почему бы не уменьшить проблему –

ответ

0

add_connected устанавливает глобальную переменную headlist, чтобы указать на местном, автоматическая переменная nuevoNodo. Это выходит за рамки, когда функция возвращает, что означает, что поведение в check_connected и все другие функции, которые обращаются к headlist, не определены.

Я не уверен, что понимаю ваш вопрос, но предположил бы, что вы создаете список, элементы которого указывают на одно и то же расположение стека (используется для nuevoNodo в add_connected). Если это происходит, обратите внимание, что это поведение не гарантируется.

Вы хотите узлы, созданные внутри add_connected остаются в силе после того, как функция возвращает поэтому необходимо выделить память динамически:

int add_connected(char *id_usuario){ 
    nodo* nuevoNodo = malloc(sizeof(*nuevoNodo)); 
    if (nuevoNodo == NULL) { 
     printf("Error - out of memory\n"); 
     return FALSE; 
    } 
    strcpy(nuevoNodo->id_usuario, id_usuario); 
    nuevoNodo->siguiente = headlist; 
    headlist = nuevoNodo; 
    size_var++; 
    return TRUE; 
} 

В конце вашей программе, вы будете должны вызвать новую функцию, которая вызывает free для каждого узла в вашем списке.