通过引用伏都教的C字符串

通过引用伏都教的C字符串,c,string,C,String,我是一个新手程序员,非常感谢大家对我的问题提出的建议 我已经做了一个过程,在缓冲区中获取一个字符串,并将其解析为三个字符,用前2个“;”分隔 我试图做的是将3个字符指针传递到存储解析字符串的位置。但我在调用函数中得到的只是内存垃圾。我做错了什么 void parseomensaje(char buf[256], char **idNodo, char **idMensaje, char **mensaje){ char *temp; temp=(char *)malloc(s

我是一个新手程序员,非常感谢大家对我的问题提出的建议

我已经做了一个过程,在缓冲区中获取一个字符串,并将其解析为三个字符,用前2个“;”分隔

我试图做的是将3个字符指针传递到存储解析字符串的位置。但我在调用函数中得到的只是内存垃圾。我做错了什么

void parseomensaje(char buf[256], char **idNodo, char **idMensaje, char **mensaje){

    char *temp; 
    temp=(char *)malloc(sizeof(buf));


    strcpy(temp, buf);
    printf("\ntemp adentro de la funcion = %s\n", temp);
    idNodo = strtok (temp,";");
    idMensaje = strtok (NULL, ";");
    mensaje = strtok (NULL, "\0");

    printf("\nADENTRO\nidNodo: %s\nidMensaje: %s\nmensaje: %s", idNodo, idMensaje, mensaje);

}
此函数的调用方式如下:

     char *idnod=NULL;
     char *idmen=NULL;
     char *men=NULL;

     idnod=(char *)malloc(sizeof(buffer));
     idmen=(char *)malloc(sizeof(buffer));
     men=(char *)malloc(sizeof(buffer));

     parseomensaje (buffer, &idmen, &idnod, &men);
char *strtok(char *str, const char *delim);
执行parseomensaje后,缓冲区包含其原始字符串,但idmen、idnod和men为空

我从教程中读到指针名称本身就是指针,所以这与通过引用传递参数是一样的,但是对于字符串,我需要将指针地址传递给指针指向指针的指针。。。 ,但我还在努力想办法

我为我的英语道歉,请随意指出我写作中的任何错误。:)

这是不正确的:

char *temp; 
temp=(char *)malloc(sizeof(buf));
由于数组将在函数中降级为
char*
,因此只分配
sizeof(char*)
字节(通常为
4
8
字节)。如果
buf
的实际长度大于
4
8
字节,则程序具有未定义的行为,因为
strcpy()
将写入超出数组边界的内容。基本上:

void parseomensaje(char buf[256], char **idNodo, char **idMensaje, char **mensaje){
相当于:

void parseomensaje(char* buf, char **idNodo, char **idMensaje, char **mensaje){

如您所说,如果您是一名新手程序员,我建议您避免动态内存分配,直到您对该语言更熟悉为止。修改程序以使用固定大小的数组而不是动态分配的内存(并防止写入超出数组边界)。一旦你能工作并完全理解它,然后尝试使用动态分配的内存。

首先,你的程序中有多个内存泄漏。一旦你不再需要这些代码,就考虑释放你分配的每一个内存块。 关于你的职能:

void parseomensaje(char buf[256], char **idNodo, char **idMensaje, char **mensaje)
为什么要在函数上传递
char**
指针?改为传递
char*
。因为strtok是这样声明的:

     char *idnod=NULL;
     char *idmen=NULL;
     char *men=NULL;

     idnod=(char *)malloc(sizeof(buffer));
     idmen=(char *)malloc(sizeof(buffer));
     men=(char *)malloc(sizeof(buffer));

     parseomensaje (buffer, &idmen, &idnod, &men);
char *strtok(char *str, const char *delim);

此外,在调用
parseomensaje
之前,您不需要分配任何内存,因为strtok会在您自己的内存上返回指针,不是新分配的。

不是问题的解决方案,但从不强制转换由
malloc返回的指针
缓冲区的大小是多少?
char**
传递给函数,以便调用方可以看到更改,除非
strcpy()
用于填充参数(应该是这样).@hmjd在这种情况下,在调用用户函数之前也不应该执行内存分配。这是正确的。我相信OP错误地认为
=
会复制字符串。@hmjd这确实是初学者的一个常见错误。感谢您的回复,我确实无法与malloc进行更正,但如果我对该句子进行注释,我会得到一个SegFault错误。但我确信我对此负有全部责任:)@user3306636,如果您只是取消对
malloc
的注释,那么
temp
就是一个统一化的指针。需要内存才能复制到:
char temp[256]例如。