在 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);
}
}
}
否则我们只是在猜测问题的根源。
请更新发布的代码并告知我们结果
在我的程序中,我使用 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);
}
}
}
否则我们只是在猜测问题的根源。
请更新发布的代码并告知我们结果