2013-10-26 3 views
0
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++; 
    } 
} 

ответ

2

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

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

Его все еще не работает для меня. –

+0

Вы видите свой ТОКЕН: 'printf'? Можете ли вы пройти через отладчик или добавить несколько отладочных отпечатков, чтобы увидеть, где происходит сбой? – rjp

+0

Не печатался. Но результатом является нежелательный код. –

3

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

ptoken = strtok(&pstr," "); 

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

char * 

Вы его как

char ** 
+0

Хорошо поймать! Я думал, что 'strtok' взял' char ** 'и вернул новый указатель для начала. Я должен был дважды проверить. – rjp

+0

OK, который работает для первой попытки. Но для тех, кто в цикле while, он все еще не работает. Является ли ptoken = strtok (NULL, '') выглядит rihgt? –

+0

@RJP Я получил предупреждение об этом, но я всегда просто игнорирую предупреждения .. –

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++; 
     } 
    } 
} 
0

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

#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; 
} 

Выход:

[email protected]:~/src/c/scratch$ ./args 
test 
COMMAND: test 

[email protected]:~/src/c/scratch$ ./args 
test this 
COMMAND: test 
TOKEN: this 

[email protected]:~/src/c/scratch$ ./args 
test this one 
COMMAND: test 
TOKEN: this 
TOKEN: one 

[email protected]:~/src/c/scratch$ ./args 
test this one two 
COMMAND: test 
TOKEN: this 
TOKEN: one 
[email protected]:~/src/c/scratch$ 

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

Смежные вопросы