I have the following Arduino code for configuring a wifi connection through a simple webpage:

I declare char* ssid;. Later I read a value from a SPIFFS config file where q_ssid is declared as a string and successfully populated from the file:

strncpy(ssid, q_ssid.c_str(), 10);

In the line above, I am limiting it to exactly 10 as that is the length of my wifi AP name that this connects to. If I change the initial char* to char ssid[10];, all works well, but SSIDs can have varying names, and if I do not use 10 chars, then the trailing spaces prevent connection in the statement WiFi.begin(ssid, password);.

On the web client handler that reads in values from the user, I use this:

String q_ssid = server.arg("ssid");
strncpy(ssid, q_ssid.c_str(), 10 );    

How can I dynamically assign the size of char* ssid; so that it can be used with the correct number of characters for the AP name that the user has stored from the webpage?

Any help is greatly appreciated.



What you need to do is creating a fixed string, this can be done in two ways:


char ssid[100];

Where 100 is the maximum length ever possible. Note that this will always use up 100 bytes, even if less are used (e.g. your string length is 5. dynamic:

char* p_ssid = malloc(100);

This way a pointer is created to a dynamically created string that can hold 100 characters. Disadvantage is that using malloc in a microcontroller can cause empty memory 'holes' when freeing/mallocing a lot.

With either way you can than use a normal strncpy or strcpy (in first case use &ssid to get a pointer to the ssid). Also don't forget to add 1 to the length because of the trailing \0 to denote the string is ended. Thus for storing 10 characters, you need an 11 char sized array.

| improve this answer | |
  • Thank you for your response. I did do this size 10 to prove that this worked but only copied in 10 characters and not n+1. I will up it to 32 which is the size that I am thinking for the maximum. Do I add the terminating null character at the end after copying in the string characters? – Tim Spanoudakis Jan 9 '18 at 20:32
  • if you do a strcpy I think it will automatically copy the \0 – Michel Keijzers Jan 9 '18 at 20:34
  • With strncpy it depends if it fits (if there are 10 characters to copy in a 10 byte buffer, than the \0 will not fit), so you have to make it one bigger – Michel Keijzers Jan 9 '18 at 20:34
  • 1
    strncpy() copies up to the maximum specified. If the number of characters, including trailing zero end of string character, is less than or equal to maximum then the end of string character will be copied as well. However if the string being copied is longer than the maximum specified then there will not be a zero character terminator. When sizing the string buffer you must specify the number of characters you want plus one to include the end of string character. char myS[MAX_COUNT + 1]; and then strncpy (myS, aString, MAX_COUNT); followed by myS[MAX_COUNT] = 0; ensures end of string. – Richard Chambers Jan 10 '18 at 2:10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.