在 strtok 中如何使用 char* 作为参数

in strtok how to use char* as a arguement

在我的程序中,我使用 malloc 将动态内存分配给 'char *' 类型的变量缓冲区。然后,如果我使用 strtok(buffer,"+");,它就会出现分段错误。我明白了 Whosebug and same problem Whosebug 的原因。但 post 都没有给我想要的解决方案。因为我不能根据我的程序使用静态内存或数组类型。 我的问题是在 strtok 中,在争论中如果我使用 char 数组然后工作正常而当使用 char * 时则给出错误。如何在 strtok 争论中使用 char *。

char *buffer;
int len;
connection_t * conn;
long addr = 0;
FILE *fptr;

if (!ptr) pthread_exit(0);
conn = (connection_t *)ptr;
const char *s = "+";
char *token;


/* read length of message */
read(conn->sock, &len, sizeof(int));
if (len > 0)
{

addr = (long)((struct sockaddr_in *)&conn->address)->sin_addr.s_addr;
buffer = (char *)malloc((len+1)*sizeof(char));
buffer[len] = 0;
/* read message */
read(conn->sock, buffer, len);
printf("%s and %d \n",buffer, addr);
/* get the first token */
token = strtok(buffer,"+");

最后一行显示分段错误

鉴于评论,包括错误检查,发布的代码需要类似于:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>



int main( void )
{

    char *buffer;
    int len;
    int sock;
    long addr = 0;
    //FILE *fptr;

    const char *s = "+";
    char *token;
    struct sockaddr_in address;
    ssize_t bytecount;

    if( 0 > (sock = socket( AF_INET, SOCK_STREAM, 0) ) )
    {
        perror( "socket failed");
        exit( EXIT_FAILURE );
    }


    // 'address' needs to be setup here
    // 'bind()' needs to be called here
    // 'connect()' needs to be called here

    addr = ((struct sockaddr_in *)&address)->sin_addr.s_addr;

    /* read length of message */
    bytecount = read(sock, &len, sizeof(int));
    if( sizeof(int) != bytecount )
    {
        fprintf( stderr, "read requested %d bytes but only got: %d bytes\n",
                (int)sizeof(int),
                (int)bytecount);
        exit( EXIT_FAILURE );
    }

    if (len > 0)
    {
        if( NULL == (buffer = malloc( (size_t)(len+1)) ) )
        { // then malloc failed
            perror( "malloc for buffer failed");
            exit( EXIT_FAILURE );
        }

        if( len == (bytecount = read( sock, buffer, (size_t)len ) ) )
        { // then correct number of bytes read
            buffer[bytecount] = '[=10=]';
            printf("%s and %ld\n", buffer, addr);

            /* get the first token */
            token = strtok(buffer, s);
            printf( "token: %s\n", token);
        }
    }
}

否则我们只是在猜测问题的根源。

请更新发布的代码并告知我们结果