2014-08-30 3 views
0

Это мой первый проект, написанный на C, и я пытаюсь разбить C-строку на «слова».strtok дает мне только первый фрагмент

следующие строки для тестирования и работать нормально:

Serial.println("SliceTest2"); 
    char *ptr; 
    char delimiter[] = " ,"; 
    ptr = strtok(packetBuffer, delimiter); 
    Serial.println(ptr); 
    ptr = strtok(NULL, delimiter); 
    Serial.println(ptr); 
    ptr = strtok(NULL, delimiter); 
    Serial.println(ptr); 
    ptr = strtok(NULL, delimiter); 
    Serial.println(ptr); 
    ptr = strtok(NULL, delimiter); 
    Serial.println(ptr); 
    ptr = strtok(NULL, delimiter); 
    Serial.println(ptr); 

С packetBuffer, содержащий "ABCDEFGH" это выход (который является правильным):

SliceTest2 
a 
b 
c 
d 
e 
f 

Теперь, когда я используя следующие строки:

char *sliceStr(char fullString[]){ 
    char *ptr; 
    ptr = strtok(packetBuffer, " "); 
    ptr = strtok(NULL, "\n\t "); 
    return("%s", ptr); 
} 

и называть их (агин с тем же содержимым в пакетеBuf FER "а б д е г ч"):

Serial.println(sliceStr(packetBuffer)); 

он должен напечатать

b 

, но делает ничего.

Это проект arduino, но проблема с C-спецификой.

Л.Г., couka

+1

Не должно быть 'char * sliceStr (char * packetBuffer) {'? – tia

+3

'ptr = strtok (packetBuffer," ");' - >> 'ptr = strtok (fullString," ");' – wildplasser

+6

Кстати, я не думаю 'return ("% s ", ptr); 'работает так, как вы думаете, что это работает. – tia

ответ

0

Это не чисто С. Serial.println ("Foo"); это метод класса. Вероятно, вы программируете на Arduino или аналогично на языке C/C++.

printf("%s", ptr); заменит %s со строкой по адресу ptr - но только потому, что она является функцией

возвращение является ключевым словом, которое возвращает значение, в этом случае вы хотите указатель ptr

return("%s", ptr); делает не имеет смысла в C.

также примечание: возвращаемый указатель char* должен указывать внутри допустимой строки c, например, объявленной перед вызовом функции. будьте осторожны, не возвращайте указатели на переменную, объявленную внутри функции, поскольку они локальны и исчезают, когда функция заканчивается.

Короче, попробуйте: return ptr;

, если он не работает и нужна дополнительная помощь, пожалуйста, указать, что именно язык и платформу вы используете

Edit: return("%s", ptr); неправильно, но будет все еще работают.

Однако вы использовали глобальную переменную packetBuffer, когда параметр, который вы хотели разметить был на самом деле fullString

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

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

char *sliceStr(char *packetBuffer){ 
    char *ptr; 
    ptr = strtok(packetBuffer, " "); 
    ptr = strtok(NULL, "\n\t "); 
    return("%s", ptr); 
} 

int main() { 
    char *str = strdup("a b c d etc"); 
    printf("%s\n", sliceStr(str)); 
} 
+2

'return ("% s ", ptr)' является действительным кодом C. Но это правда, что это не имеет смысла. – AnT

+2

Андрей Т прав. В 'c', инструкция' '% s", ptr' действительна и оценивается слева направо, причем самым правым значением является возвращаемое значение всего оператора. Поэтому оператор 'return ("% s ", ptr)' будет возвращать значение 'ptr'. – alvits

+0

'Serial.println (" foo ");' также является C, если 'Serial' является именем' struct' с элементом-указателем-функцией, называемым 'println'. –

0

Спасибо за ваши советы.

Смешивание packetBuffer и fullString было немым, но не вызывало проблемы, так как до сих пор оно всегда имело одинаковое содержание.

return("%s", ptr) не законченная линия и не имеет никакого смысла, как есть, но проблем здесь нет.

Мне не удалось заставить его работать с чистым C, поэтому я буду использовать C++ и его класс String. Не хотелось, но нормально ...

В любом случае проблема, кажется, в линии ptr = strtok(NULL, " ");.

ptr = strtok(fullString, " "); 

дает мне первое слово, как задумано, но повторять его с NULL никогда не работает.

lg, couka

+0

Чувак скопируйте/вставьте код в свой ответ и скомпилируйте его и запустите, вы увидите, что он работает. Я сам его тестировал. – RumburaK

+0

Я понимаю, что вы исправили свой код, но я не знаю, как это сделать. В зависимости от того, где находится этот буфер, и отношений между вашей функцией и внешними переменными может быть много побочных эффектов. Если вы настаиваете на том, что ваш код правильный, но он не работает, просто вставьте сюда весь источник, я посмотрю. – RumburaK

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