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++;
}
}
ответ
read
не возвращает пустую строку, завершенную символом, который strtok
ожидает. Вам нужно будет выделить один дополнительный байт во входе, чтобы добавить '\0'
. Вы можете посмотреть возвращаемое значение read
, чтобы узнать, сколько байтов было прочитано, а затем поместите '\0'
по адресу input[a]
.
int a = read(0,input,buffersize-1);
input[a] = '\0';
Проблема, скорее всего, будет в
ptoken = strtok(&pstr," ");
Первый аргумент strtok должен быть
char *
Вы его как
char **
Хорошо поймать! Я думал, что 'strtok' взял' char ** 'и вернул новый указатель для начала. Я должен был дважды проверить. – rjp
OK, который работает для первой попытки. Но для тех, кто в цикле while, он все еще не работает. Является ли ptoken = strtok (NULL, '') выглядит rihgt? –
@RJP Я получил предупреждение об этом, но я всегда просто игнорирую предупреждения .. –
Несколько исправлений (и другое) в вашем коде. В комментариях описано, что я изменил: (если была определена функция 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++;
}
}
}
Вот нормальный, разумный способ сделать это:
#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$
Я оставлю зачистки новой строки в качестве упражнения для вас.
- 1. Сегментация вина
- 2. вина Сегментация с зЬгсру()
- 3. Ассамблея Сегментация вина: 11
- 4. вина Сегментация итератора разыменования
- 5. Сегментация вина C
- 6. вина Сегментация перед возвращением
- 7. libyahoo вина Сегментация
- 8. вина Сегментация (ядро сбрасывали)
- 9. вина Сегментация с pthread_join
- 10. Сегментация вина 11
- 11. jonesforth сегментация вина
- 12. вина Сегментация с strtol
- 13. fgets() сегментация вина
- 14. C++ Сегментация вектор вина
- 15. вина Сегментация с PyType_IsSubtype
- 16. Сегментация вина - станд :: _ Rb_tree
- 17. вина Сегментация CAFFE
- 18. вина Сегментация для зсапЕ
- 19. PyGtk и сегментация вина
- 20. вина Сегментация, Ruby
- 21. SIGSEGV, вина Сегментация C
- 22. вина Сегментация - Magical Запись
- 23. вина Сегментация вызова setvbuf
- 24. C Сегментация вуду вина
- 25. вина Сегментация с помощью STRCMP (Ubuntu)
- 26. strtok() - Сегментация Fault
- 27. вина Сегментация и перегрузка операторов
- 28. вина Сегментация в сборке программы
- 29. C, atoi() генерации вина Сегментация
- 30. вина Сегментация (ядро сбрасывали) СТЕК
Его все еще не работает для меня. –
Вы видите свой ТОКЕН: 'printf'? Можете ли вы пройти через отладчик или добавить несколько отладочных отпечатков, чтобы увидеть, где происходит сбой? – rjp
Не печатался. Но результатом является нежелательный код. –