EdNigma ha scritto:
Mi riferivo a qualcosa di molto più pratico, strlen() ritorna la lunghezza della stringa senza contare il carattere terminatore, quindi la riga con la malloc() va aggiustata.
Hai ragione. Posso porti un quesito allora?
Prendiamo questo codice che ho scritto cosi per prova.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>
#include <time.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char** argv){
char* s1 = "casa\0";
unsigned long int len1 = strlen(s1);
printf("Prova 1. ");
for (int i = 0; i < len1; i++){
printf("%c", s1[i]);
}
printf("\nProva 2. ");
printf("%s", s1);
// Faccio una copia senza copiare il carattere finale '\0'
char *s2 = (char*)malloc(len1 * sizeof(char));
for (int i = 0; i < len1; i++){
s2[i] = s1[i];
}
printf("\nProva 3. ");
for (int i = 0; i < len1; i++){
printf("%c", s2[i]);
}
printf("\nProva 4. ");
printf("%s", s2);
return 0;
}
Nelle prima due prove tratto s1 come una stringa normale e mi comporto nella prima prova trattandola come un array di char e nella seconda prova faccio una chiamata alla printf con il label "%s".
Poi copio la stringa evidenziando quello che mi hai fatto notare. che manca uno spazio finale per il carattere '\0'.
Ma l'output è identico. Perché?
Questo è l'output.
Prova 1. casa
Prova 2. casa
Prova 3. casa
Prova 4. casa
Questo il mio:
Prova 1. casa
Prova 2. casa
Prova 3. casa
Prova 4. casa-
Process returned 0 (0x0) execution time : 0.078 s
Press any key to continue.
Sei stato più fortunato di me!
In ogni caso molto più semplicemente:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *s1 = "abcdefgh";
unsigned int l1 = strlen(s1);
printf("%s\n", s1);
char *s2 = (char*)malloc(l1 * sizeof(char));
for(unsigned int i = 0; i < l1; ++i)
{
s2[i] = s1[i];
}
printf("%s\n", s2);
return 0;
}
output:
abcdefgh
abcdefghÕ¿]M?n
Process returned 0 (0x0) execution time : 0.117 s
Press any key to continue.
P.S.
se vuoi stampare o salvare una stringa contenente delle sottostringhe coincidenti con sequenze di escape, bisogna raddoppiare il carattere \ o % che le iniziano.
Compila il seguente codice per capire cosa intendo:
#include <stdio.h>
#include <string.h>
int main()
{
char *s1 = "ab\n??\0!!";
printf("len1 = %d \ns1 = %s \n\n", strlen(s1), s1);
char *s2 = "ab\\n??\\0!!";
printf("len2 = %d \ns2 = %s \n\n", strlen(s2), s2);
printf("stampo il simbolo della percentuale seguito da una d: %d \n\n");
printf("stampo il simbolo della percentuale seguito da una d: %%d \n\n");
return 0;
}
output:
len1 = 5
s1 = ab
??
len2 = 10
s2 = ab\n??\0!!
stampo il simbolo della percentuale seguito da una d: 10
stampo il simbolo della percentuale seguito da una d: %d
Process returned 0 (0x0) execution time : 1.301 s
Press any key to continue.