Problema concatenazione stringhe

Buondì, mi ritrovo ancora qui a chieder un piccolo aiuto :wink:
Nel listato che segue, devo inserire una stringa all'interno di un'altra più grande, usando i metodi .substring e l'operatore di aggregazione delle stringhe.
Il problema età nel fatto che la prima concatenazione funziona, la seconda no...e la stringa rimane incompleta.

Codice Parziale :

                String sub1 = s.substring(0, s_index);
                String sub2 = s.substring(s_index);
                
                Serial.print("SubString1 : ");
                Serial.println(sub1);
                Serial.print("SubString2 : ");
                Serial.println(sub2);
      
         
                s=String();  // Pulisco "s"
                s = sub1 ;
                s += "CARATTERE";
                s += sub2;

Sketch TOTALE

/* Queso sketch Legge un file testo in ingresso e produce un file "test.txt" uguale, memorizzato su SD card. */


#include <SPI.h>
#include <SD.h>

int i=0;


void setup() {
  
  Serial.begin(9600);
  if (!SD.begin(4)) {  Serial.print("Errore sulla SD..."); return; }
}


void loop()
{
  
  if(i==0){      // Senza questo, il loop leggerebbe il file continuamente, senza fine..
    i++;
    char c;
    String s=String();
    char* file_to_load = "index.htm";
    File htmlFile = SD.open( file_to_load );
   
    if (!htmlFile) {
      Serial.print("Errore : Il file ' ");
      Serial.print(file_to_load);
      Serial.println("' non esiste!");
      exit(0);
    }
    
    if (SD.exists("test.htm")) {
      Serial.println("'test.txt' esiste gia'...rimozione in corso..'");
      SD.remove("test.htm");
    }
    // Creo un nuovo file per scriverci su la versione modificata dell'altro
    File myFile = SD.open("test.htm", FILE_WRITE);
   
   
    // Ricevo i caratteri
    Serial.println("Lettura File");



 /* 1* VERSIONE
  while (htmlFile.available()) {
      
        boolean end_row = false;
        s = String();
        
        while(!end_row && htmlFile.available()) {
            c = htmlFile.read();
            
            if(c == '\n'){
                end_row = true; 
            }
            s += c;
        }// FINE RIGA
      
          Serial.println(s);
        myFile.println(s);
         
  }*/
  
  // 2° VERSIONE
  
   boolean end_row = false;
  
   while (htmlFile.available()) {
      
        c = htmlFile.read();
        // in ogni caso, aggiungo il carattere alla stringa
        s += c;
        
        // ho raggiunto la fine della riga?
        if(c == '\n'){
            end_row = true; 
        }
        
        // Se ho raggiunto la fine, stampo, azzero le variabili e passo alla successiva
        if(end_row) {
          
            // Verifico se quella ricevuta è una stringa da modificare
            int s_index = find_index(s);
            
            if(s_index>-1) { // Ho trovato il tag "id=value"
                Serial.print("Indice trovato a : ");
                Serial.println(s_index);
                
                
                String sub1 = s.substring(0, s_index);
                String sub2 = s.substring(s_index);
                
                Serial.print("SubString1 : ");
                Serial.println(sub1);
                Serial.print("SubString2 : ");
                Serial.println(sub2);
      
         
                s=String();  // Pulisco "s"
                s = sub1 ;
                s += "CARATTERE";
                s += sub2;
                
                sub1 = String();
                sub2 = String();
                  
         }
              
            Serial.println(s);
            myFile.println(s);
            end_row = false;
            s = String();
        }// FINE RIGA
       
   }
   // Se è l'ultima stringa, non ci son più caratteri da leggere..
   s += '\n';
 
   // Scrivo l'ultima stringa del file
   myFile.println(s);
  
  
   Serial.println("Scrittura Terminata");
  
   htmlFile.close();
   myFile.close();
  
  
  Serial.println("");
  Serial.println("Lettura del File Scritto");
  Serial.println("");
  
  myFile = SD.open("test.htm", FILE_READ);
  
  while (myFile.available()) {
        Serial.write(myFile.read());
  }
  
  myFile.close();
  
  } // fine - if(i=0)
}



int find_index(String s){
  
  int index=s.indexOf("value");
  if(index>-1) { // Ho trovato il tag "id=value"
      return (index + 10); // Index + 5 (caratteri di "value") + 5 (numero del tag all'interno della tablella html, x_y)
  }else
      return (-1);
}

ok, risolto.
Era un problema di memoria, in quanto la concatenazione alloca ogni volta nuova memoria.
Quindi ho risolto, stampando le substrings indipendentemente.

Io ti consiglio di non usare la classe String. Su queste MCU con poca SRAM è facile esaurire la memoria senza volerlo.
Meglio le stringhe classiche del C (vettori di char terminati da null => '\0' ) più ostiche ma più "sicure".

Puoi provare ad usare anche "strcat"

http://www.cplusplus.com/reference/cstring/strcat/

Grazie nid, ma non avevo molto tempo e quindi ho cercato la via più veloce......che poi così veloce non è stata :grin:
Per il progetto vero e proprio userò le stringhe, almeno so cosa alloco e quando..