Невидимый символ в const char * как разделитель strtok () - PullRequest
0 голосов
/ 16 января 2012

Мне пришлось разделить полезную нагрузку сетевых данных на символ «новой строки» или «перевода строки» (10 декабря, шестнадцатеричный 0x0A).Поэтому я попытался использовать функцию strtok (), с которой я столкнулся с несколькими проблемами, когда хотел создать строку константных символов с символом «новая строка».

Proto:

`strtok(char * StringToSplit, const char * Delimiters)`

Это сделало неверный инициализатор:

`const char delim[] = 10;`

Это дало предупреждение о создании указателя из int без приведения;Несмотря на то, что
printf("Delim: %x", delim)

показал правильное значение delim (0xa), приложение аварийно завершает работу при использовании в strtok ().

`const char * delim = 10;`

Нет предупреждений или ошибок, printf («Delim:% x», delim) дал правильное значение, но strtok () не работал (как я и ожидал).

`char delim = 10;`
`(ofc strtok(..., &delim))`

Это похоже назадание, но я все еще получил предупреждение о передаче неконстантного ptr-символа, где ожидалось, что const char ptr будет выполнять функцию strtok ().

`char delim[] = "#";`  
`delim[0] = 10;`

Наконец, похоже, это работает без предупреждений.

`char tmp[] = "#";`  
`tmp[0] = 10;`  
`const char *delim = tmp;`

Вопрос в том, какой самый простой и элегантный способ передать такой невидимый символ в функцию strtok ()?Мне кажется, что это просто замешанный код.

Ответы [ 2 ]

1 голос
/ 16 января 2012

Вам необходимо:

const char *delim = "\n";

Вторым параметром должна быть строка C, содержащая разделители.В ваших различных воплощениях есть много вещей, которые не являются C-строками, которые неправильно приводятся к C-строкам.

0 голосов
/ 16 января 2012

Это не клудж или не элегантность, просто есть много ошибок.

 const char delim[] = 10;

Почему вы объявляете массив здесь? Это должно быть:

 const char delim = 10;

А потом:

 char delim[] = "#";

Почему вы объявляете массив и устанавливаете его равным string ? Это должно быть:

 char delim = '#';
...