@@ -45,6 +45,12 @@ String::String(const char *cstr)
4545if (cstr)copy (cstr,strlen (cstr));
4646}
4747
48+ String::String (const char *cstr,unsigned int length)
49+ {
50+ init ();
51+ if (cstr)copy (cstr, length);
52+ }
53+
4854String::String (const String &value)
4955{
5056init ();
@@ -192,7 +198,8 @@ String & String::copy(const char *cstr, unsigned int length)
192198return *this ;
193199}
194200len = length;
195- strcpy (buffer, cstr);
201+ memcpy (buffer, cstr, length);
202+ buffer[len] =' \0 ' ;
196203return *this ;
197204}
198205
@@ -212,8 +219,9 @@ void String::move(String &rhs)
212219{
213220if (buffer) {
214221if (rhs && capacity >= rhs.len ) {
215- strcpy (buffer, rhs.buffer );
222+ memcpy (buffer, rhs.buffer , rhs. len );
216223len = rhs.len ;
224+ buffer[len] =' \0 ' ;
217225rhs.len =0 ;
218226return ;
219227}else {
@@ -284,8 +292,9 @@ unsigned char String::concat(const char *cstr, unsigned int length)
284292if (!cstr)return 0 ;
285293if (length ==0 )return 1 ;
286294if (!reserve (newlen))return 0 ;
287- strcpy (buffer + len, cstr);
295+ memcpy (buffer + len, cstr, length );
288296len = newlen;
297+ buffer[len] =' \0 ' ;
289298return 1 ;
290299}
291300
@@ -297,59 +306,56 @@ unsigned char String::concat(const char *cstr)
297306
298307unsigned char String::concat (char c)
299308{
300- char buf[2 ];
301- buf[0 ] = c;
302- buf[1 ] =0 ;
303- return concat (buf,1 );
309+ return concat (&c,1 );
304310}
305311
306312unsigned char String::concat (unsigned char num)
307313{
308314char buf[1 +3 *sizeof (unsigned char )];
309315itoa (num, buf,10 );
310- return concat (buf, strlen (buf) );
316+ return concat (buf);
311317}
312318
313319unsigned char String::concat (int num)
314320{
315321char buf[2 +3 *sizeof (int )];
316322itoa (num, buf,10 );
317- return concat (buf, strlen (buf) );
323+ return concat (buf);
318324}
319325
320326unsigned char String::concat (unsigned int num)
321327{
322328char buf[1 +3 *sizeof (unsigned int )];
323329utoa (num, buf,10 );
324- return concat (buf, strlen (buf) );
330+ return concat (buf);
325331}
326332
327333unsigned char String::concat (long num)
328334{
329335char buf[2 +3 *sizeof (long )];
330336ltoa (num, buf,10 );
331- return concat (buf, strlen (buf) );
337+ return concat (buf);
332338}
333339
334340unsigned char String::concat (unsigned long num)
335341{
336342char buf[1 +3 *sizeof (unsigned long )];
337343ultoa (num, buf,10 );
338- return concat (buf, strlen (buf) );
344+ return concat (buf);
339345}
340346
341347unsigned char String::concat (float num)
342348{
343349char buf[20 ];
344350char * string =dtostrf (num,4 ,2 , buf);
345- return concat (string, strlen (string) );
351+ return concat (string);
346352}
347353
348354unsigned char String::concat (double num)
349355{
350356char buf[20 ];
351357char * string =dtostrf (num,4 ,2 , buf);
352- return concat (string, strlen (string) );
358+ return concat (string);
353359}
354360
355361unsigned char String::concat (const __FlashStringHelper * str)
@@ -378,7 +384,7 @@ StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs)
378384StringSumHelper &operator + (const StringSumHelper &lhs,const char *cstr)
379385{
380386StringSumHelper &a =const_cast <StringSumHelper&>(lhs);
381- if (!cstr || !a.concat (cstr, strlen (cstr) )) a.invalidate ();
387+ if (!cstr || !a.concat (cstr)) a.invalidate ();
382388return a;
383389}
384390
@@ -629,10 +635,7 @@ String String::substring(unsigned int left, unsigned int right) const
629635String out;
630636if (left >= len)return out;
631637if (right > len) right = len;
632- char temp = buffer[right];// save the replaced character
633- buffer[right] =' \0 ' ;
634- out = buffer + left;// pointer arithmetic
635- buffer[right] = temp;// restore character
638+ out.copy (buffer + left, right - left);
636639return out;
637640}
638641