Strtok() Ошибка сегментации

struct args
{
 char command[64];
 char args[2][64];
};

int argscount = 0;
struct args* arguments;
int buffersize = 64;
char *ptoken = NULL;
char input[buffersize];
char *pstr = NULL;



int a = read(0,input,buffersize);
pstr = input;
arguments = malloc(sizeof(struct args)); 
if(a>0){ 
 ptoken = strtok(&pstr," ");
 strcpy(arguments->command,ptoken);
 printf("TOKEN:%s\n", ptoken);
 while( ptoken != NULL ) {
 if(argscount > 1){break;}
 ptoken = strtok(NULL, ' ');
 strcpy(arguments->args[argscount],ptoken);
 argscount++; 
 } 
}
4 ответа

Проблема, скорее всего, будет в

ptoken = strtok(&pstr," ");

Первый аргумент strtok должен быть

char *

У вас это как

char **


read не возвращает строку с нулевым завершением, которую ожидает strtok. Вам нужно будет выделить один дополнительный байт во вводе, чтобы добавить '\0'. Вы можете посмотреть возвращаемое значение read чтобы узнать, сколько байтов было прочитано, а затем поместите '\0' на input[a].

int a = read(0,input,buffersize-1);
input[a] = '\0';


Несколько исправлений (и других) в вашем коде. В комментариях описано, что я изменил: (если была определена функция read() возможно, она была создана). Также добавлен основной, просто для компиляции ошибок.

#include <ansi_c.h>

 struct args
{
 char command[64];
 char args[2][64];
};

int argscount = 0;
struct args* arguments;
size_t buffersize = 64; //changed to size_t
char *ptoken = NULL;
char input[64]; //variable initializer not allowed, changed
char *pstr = NULL;

int read(int a, char *s, size_t size);


main(void)
{

 int a = read(0,input,buffersize);

pstr = input;
arguments = malloc(sizeof(struct args)); 
if(a>0)
 { 
 ptoken = strtok(pstr," "); //changed &pstr to pstr
 strcpy(arguments->command,ptoken);
 printf("TOKEN:%s\n", ptoken);
 while( ptoken != NULL ) {
 if(argscount > 1){break;}
 ptoken = strtok(NULL, " "); //changed ' ' to " "
 strcpy(arguments->args[argscount],ptoken);
 argscount++; 
 } 
 }
}
</ansi_c.h>


Здесь нормальный, разумный способ сделать это:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

struct args {
 char command[64];
 char args[2][64];
};

int main(void) {
 char input[64] = {0};

 if ( read(0, input, sizeof(input) - 1) == -1 ) {
 perror("unsuccessful read() operation");
 return EXIT_FAILURE;
 }

 char * ptoken = strtok(input, " ");
 if ( ptoken == NULL ) {
 fprintf(stderr, "No valid input\n");
 return EXIT_FAILURE;
 }

 struct args arguments;
 strcpy(arguments.command, ptoken);
 printf("COMMAND: %s\n", arguments.command);

 int argscount = 0;
 while ( ptoken && argscount < 2 ) {
 ptoken = strtok(NULL, " ");
 if ( ptoken ) {
 strcpy(arguments.args[argscount], ptoken);
 printf("TOKEN: %s\n", arguments.args[argscount++]);
 }
 }

 return 0;
}
</unistd.h></string.h></stdlib.h></stdio.h>

Вывод:

paul@local:~/src/c/scratch$ ./args
test
COMMAND: test

paul@local:~/src/c/scratch$ ./args
test this
COMMAND: test
TOKEN: this

paul@local:~/src/c/scratch$ ./args
test this one
COMMAND: test
TOKEN: this
TOKEN: one

paul@local:~/src/c/scratch$ ./args
test this one two
COMMAND: test
TOKEN: this
TOKEN: one
paul@local:~/src/c/scratch$

Я останусь за исключением новой строки как упражнения для вас.

licensed under cc by-sa 3.0 with attribution.