Răspuns :
Am modificat putin codul, in mare e acelasi lucru :
#include <iostream>
#include <cstring>
using namespace std;
int main() {
int i;
char s[256];
cin.getline(s, 256);
if (s[0] >= 'a' && s[0] <= 'z') s[0] = s[0] - 32; //Primul caracter
for (i = 0; i < strlen(s); i++) {
if (strchr(" ", s[i + 1]) != nullptr) s[i] = s[i] - 32;
if (strchr(" ", s[i - 1]) != nullptr) s[i] = s[i] - 32;
}
cout << s;
}
Modificarile facute ne ajuta sa intelegem mai bine diferenta dintre un null pointer (nullptr - pointer catre adresa de memorie 0) si caracterul NULL aflat la sfarsitul stringurilor in C (caracter care are cod ASCII 0).
In plus am imbunatatit putin lizibilitatea.
► De ce functioneaza ?
Functia strchr(char * str, char c) returneaza pointer catre prima aparitie a caracterului c in sirul str. Daca nu exista, returneaza nullptr.
Pentru a intelege de ce ultimul caracter se transforma ar trebui sa aruncam o privire pe documentatia oficiala C++ referitoare la functia strchr :
"The terminating null-character is considered part of the C string."
In secventa "if (strchr(" ", s[i + 1]) != nullptr) s[i] = s[i] - 32;" verificam daca urmatorul caracter din sirul s se regaseste in sirul " ". Dar sirul " " este in realitate alcatuit din caracterul spatiu si caracterul NULL. Deoarece acel caracter NULL este considerat parte din sir in functia strchr, daca s[i+1] este caracterul NULL aflat la finalul propozitiei s, acesta se va potrivi cu caracterul NULL aflat la finalul sirului de caractere " ". Astfel se va returna pointer nenul catre caracterul NULL din sirul " ", pointer care e diferit de nullptr.