0

I've got an array of char* with serial data that I'm trying to remove ':' from. I have tried to iterate through the char*, find and remove any colons but it just comes out as garbage.

 char* espData[15];
 // pull data from serial and tokenize with strtok > feed to espData
 for(int x = 0; x < index-1; x++){
 size_t nullTerm = strlen(espData[x]);
 espData[x][nullTerm - 1] = '0円';
 char* output
 for(size_t i = 0; i < strlen(espData[x]); ++i){
 if(espData[x][i] != ':') output += espData[x][i];
 }
 espData[x] = output;
 Serial.println(espData[x]);
 }

Moving the null character works fine (I wanted to get rid of the last character in every string). Most of the answers I found for general C++ used std::string which we don't have access to.

asked Jun 15, 2016 at 1:02
8
  • Arithmetic on a char* does nothing to its contents. Commented Jun 15, 2016 at 1:32
  • the comment tokenize with strtok suggests your code uses strtok, which would be one (probably bloated) solution - yet your code doesn't use strtok!!? Commented Jun 15, 2016 at 3:53
  • espData[x][nullTerm - 1] = '0円'; is redundant code Commented Jun 15, 2016 at 3:55
  • @Jaromanda Actually, it overwrites the last character in the string - or underflows the buffer if nullTerm is 0! Commented Jun 15, 2016 at 10:11
  • @JohnBurger - of course you're right Commented Jun 15, 2016 at 10:23

1 Answer 1

1

You've assumed that a char * is some kind of string object, since you've got the following line of code: output += espData[x][i];, and then later espData[x] = output;

It quite simply doesn't work like that. At best you can point output inside espData[x] and then do some other logic: but your attempt to "accumulate" the correct characters is incorrect.

Please consider the following code instead:

char* espData[15];
for(int x = 0; x < index-1; x++){
 size_t nullTerm = strlen(espData[x]); // Get current length
 char* output = espData[x]; // Start of string
 for (size_t i = 0; i < nullTerm; ++i){
 if(espData[x][i] != ':') { // If it's NOT a colon
 *output++ = espData[x][i]; // Copy character 'up'
 } // if
 // If it WAS a colon, then
 // output does NOT get incremented
 } // for
 *output = '0円'; // End string off with NUL
 Serial.println(espData[x]);
} // for
answered Jun 15, 2016 at 9:54
2
  • That works perfectly, thank you! I have never been great with pointers Commented Jun 15, 2016 at 22:05
  • @Tri42 I just finished a pointer-post on another question. Take a look: arduino.stackexchange.com/a/25317/22924 Commented Jun 16, 2016 at 3:17

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.