1

此代码在“check_connected”过程中有一个奇怪的行为。该参数在使用strncmp函数前转换为char[30],否则为“栈溢出”。问题出现在比较两个字符串的结果中,“Le solteria rige el corason..” --> 这是参数“La solteria rige el corazon...” --> 这是存储在列表中的结果是 0。我知道 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();
}
4

1 回答 1

0

add_connected将全局变量设置headlist为指向本地的自动变量nuevoNodo。当函数返回时,这超出了范围,这意味着未定义check_connected访问的所有其他函数中的行为。headlist

我不确定我是否理解您的问题,但会猜测您正在创建一个列表,其元素都指向同一个堆栈位置(用于nuevoNodoin 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列表中的每个节点。

于 2013-11-16T13:50:45.460 回答