👤
Edyedy25
a fost răspuns

Asa am rezolvat o problema . Imi da corect , nu inteleg de ce ultimul caracter se face automat litera mare .Dupa ultimul caracter nu este NULL ?
#include
#include
using namespace std ;
int main ()
{int n,i;
char s[256];
cin.getline(s,256);
for(i=0;i ='a'&&s[i]<='z')
{
if(strchr(" ",s[i+1])!=NULL)
{
s[i]=s[i]-32;
}
if(strchr(" ",s[i-1])!=NULL)
{
s[i]=s[i]-32;

}
}
}
c o u t < < s;
}

Problema :
Se da un sir de caractere reprezentând o propozitie formata din litere mici ale alfabetului englez si spatii.



Cerinta
Transformati sirul dat astfel încât prima si ultima litera a fiecarui cuvânt sa fie înlocuite cu litera mare corespunzatoare.


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.

Vezi imaginea Andrei750238