Read data from EEPROM incomplete

Hi,I'm implementing data writing&reading with EEPROM of NodeMCU to save Wifi's SSID and password,

I Power On NodeMCU Serial print infomation above:

EEPROM data is empty,can not get value,need SmartConfig!
Wait for SmartConfig
........................................SmartConfig Success
**SSID:TP-LINK_370EF5 **
PSW:
WiFi config saved to EEPROM SSID=TP-LINK_370EF5,password= //the SSID value is correct!
IP address: 192.168.1.113

I press NodeMCU Reset Button the Serial print info above

ESP8266 Module Starting....
Connect to Wifi
ssid=P-LINK_370EF5 //Look! the SSID read from EEPROM lost the first char "T"
password=
...................Connect WiFi Timeout ,need to ReConfig!

the first char of SSID is lost ,where is wrong?

#include <EEPROM.h>
#include <ESP8266WiFi.h>
#include <Ticker.h>

int addr = 0; 
int val =0;  //val=1 mean  EPROM saved data , val=0 mean EPROM is empty
String wifi;
String pwd;
Ticker timer0;  
WiFiClient espClient;

struct CONFIG
{
   char ssid[32];
   char pass[32];
};
 
CONFIG buf;

void ResetFlag()
{
   EEPROM.begin(100);
   EEPROM.write(addr,0);     
   EEPROM.end();
}

void SetFlag()
{
   EEPROM.begin(100);
   EEPROM.write(addr,1);     
   EEPROM.end();
}

void ReConfig()
{
   ResetFlag();
   Serial.println("Connect WiFi Timeout ,need to ReConfig!");
   
}
void smartConfig()
{
  WiFi.mode(WIFI_STA);
  Serial.println("\r\nWait for SmartConfig");
  WiFi.beginSmartConfig();
  while (1)
  {
    Serial.print(".");
    digitalWrite(LED_BUILTIN, 0);
    delay(200);
    digitalWrite(LED_BUILTIN, 1);
    delay(200);
    if (WiFi.smartConfigDone())
    {
      Serial.println("SmartConfig Success");
      Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
      Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
      wifi=WiFi.SSID();
      pwd =WiFi.psk();
      saveConfig();

      Serial.print("WiFi config saved to EEPROM SSID=");
      Serial.print (buf.ssid);
      Serial.print(",password=");
      Serial.println(buf.pass);

      SetFlag();
      
      delay(5000);
      Serial.print("IP address: ");
      Serial.println(WiFi.localIP());
      break;
    }
  }
}

void saveConfig()  /*save config to eeprom */
{
  EEPROM.begin(512);
  strcpy(buf.ssid, WiFi.SSID().c_str());
  strcpy(buf.pass, WiFi.psk().c_str());
  EEPROM.put<CONFIG>(0, buf);
  EEPROM.commit();
}

void loadConfig()  /* load config from eeprom */
{
  EEPROM.begin(512);
  EEPROM.get<CONFIG>(0, buf);
}

void get_eeprom()
{
  EEPROM.begin(100);
  val = EEPROM.read(addr);
  if (val==0) 
  { 
    Serial.println("EEPROM data is empty,can not get value,need SmartConfig!");
    smartConfig();
  }
  else 
  {
    Serial.println("Connect to Wifi");
    loadConfig();
    Serial.print("ssid=");Serial.println(buf.ssid);
    Serial.print("password=");Serial.println(buf.pass);
    WiFi.mode(WIFI_STA);
    WiFi.begin(buf.ssid,buf.pass);
    timer0.attach(10,ReConfig);
    while (WiFi.status() != WL_CONNECTED) 
    {
      delay(500);
      Serial.print(".");
    }
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    }
}

void setup()
{
  Serial.begin(115200);
  if(!Serial){;}
  delay(3000);
  Serial.println("ESP8266 Module Starting....");
  get_eeprom();
}

mqtt-test-eeprom.ino (2.49 KB)

Your SetFlag() overrides first byte of eeprom.
Move ssid storage by one:

void saveConfig()  /*save config to eeprom */
{
 EEPROM.begin(512);
 strcpy(buf.ssid, WiFi.SSID().c_str());
 strcpy(buf.pass, WiFi.psk().c_str());
 EEPROM.put<CONFIG>(1, buf);
 EEPROM.commit();
}

Also, don't nest functions like that. Instead, call your functions one after another from one place.