2015-07-04 2 views
-6

У меня есть 2 проблемы с этой функцией:Нахождение запятые внутри массива символов

char * getHeader(char localString[], int seperatorNum) 
{ 
    int maxL=50; 
    const char seperator=':'; 
    char newdata[maxL]; 
    int counter=0; 
    for(int k=0;k<maxL;k++) 
    { 
     if (localString[k]== seperator ) 
     { 
      counter++; 
      if(counter==seperatorNum) 
      { Serial.println(newdata); return newdata;  } 
     } 
     newdata[k]=localString[k]; 
    } 
} 
  1. Когда я напечатаю newdata я получаю мусор, но localString[k] показывает хорошие результаты.
  2. Как я могу вернуть массив - мой путь хорош?

Редактировать: я получаю bb после каждого результата. так:

aaa:sss (send) 
aaabb (get) 
kkk:ooo (send) 
kkkbb (get) 
ppp:ttt 
pppbb 
+0

Это не трудно буквам ** I ** правильно, вы знаете. Конечно, люди это понимают, но правильное произношение свидетельствует о том, что люди читают ваш вопрос. –

+4

':' - это двоеточие. Запятая - '. – Mat

+0

что? не получится – Curnelious

ответ

0

очистка массива, который будет иметь некоторые значения в нем, будет решить эту проблему, и это происходит потому, что при печати, и есть некоторые другие ценности в ней, вы получите их напечатанные слишком

for(int i = 0; i < maxL; ++i) 
    newdata[i] = (char)0; 

решить полностью.

EDIT: А для тех, кто нуждается, это полная функция, которая работает:

char * getHeader(char localString[], int seperatorNum) 
{ 


    int maxL=50; 
    const char seperator=':'; 
    char newdata[maxL]; 
    int counter=0; 
    int divider=0; 
    //clear array when it has garbage it added 
    for(int i = 0; i < maxL; ++i) 
     newdata[i] = (char)0; 

    for(int k=0;k<maxL;k++) 
    { 


     if (localString[k]== seperator ) 
     { 

      counter++; 
      divider=k+1; 
      if(counter==seperatorNum) 
      { return newdata;  } 
     } 
     if( (seperatorNum-1) ==counter) 
      newdata[k-divider]=localString[k]; 

    } 


} 
+0

Вам не нужно очищать массив * whole *, вам просто нужно очистить байт после последнего символа. Кроме того, вы не должны возвращать 'newdata', так как это нестатический массив, локальный для функции - он недействителен после возвращения вашей функции. Вы можете сделать статичность 'newdata', но тогда каждый вызов использует тот же массив .. или вместо этого возвращает динамически выделенный массив. Или разрешить пользователю передавать массив функции и заполнять его. Кроме того, вам нужно добавить возврат в конец, если разделитель не найден. – Dmitri

1
newdata[k]=localstring[k]; 

Если должно прийти только после того, как

for(int k=0;k<maxL;k++) 
{ 
//here 

И если это не решает тогда просьба представить связанную полный код.

+0

нет, снова это неправильный ответ. проверьте мое редактирование, пожалуйста. – Curnelious

+0

если я отправляю эту функцию aaaa: bbbb, я должен получить 4 итерации, поэтому сначала это не хорошо, другие хороши. – Curnelious

+0

@ Корректируемое обновление проверки и, пожалуйста, также сообщите, какие значения вы передаете как второй аргумент. – ameyCU

0
char * getHeader(char localString[], int seperatorNum) 
{ 
    int maxL=50; 
    const char seperator=':'; 
    char newdata[maxL]; 
    memset(newdata, '\0', maxL);/////// 
    int counter=0; 
    int i = 0; /////// 
    for(int k=0;k<maxL;k++) 
    { 
     if (localString[k] == seperator ) 
     { 
      counter++; 
      if(counter == seperatorNum) 
      { 
       Serial.println(newdata);  
       return newdata;  
      } 
     }else{ 
      newdata[i] = localString[k];//outside the else this was alway executed. I assume you didn't want the seperator in this 
      i++; 
     } 
    } 
} 
+0

не работает. Благодарю. проверьте его с помощью aaa: bbbb вы получаете мусор. – Curnelious

+0

сделана модификация – jdl

+0

его не работает, и на самом деле я не думаю, что это так. потому что если вы отправите его aaa: bbbb (в четвертый раз), у вас будет несколько итераций, – Curnelious

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