gpt4 book ai didi

c - strncmp 的奇怪行为

转载 作者:行者123 更新时间:2023-11-30 17:44:23 28 4
gpt4 key购买 nike

这段代码在“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();
}

最佳答案

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

我不确定我是否理解您的问题,但猜测您正在创建一个列表,其元素全部指向同一堆栈位置(用于 add_connected 中的 nuevoNodo >)。如果发生这种情况,请注意,无法保证这种行为。

您希望在 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

关于c - strncmp 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20019168/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com