PDA

Visualizza la versione completa : [C] Conversione minuscolo a maiuscolo ed errore di segmentation fault


Tronod'Ombra
08-07-2012, 20:08
Ho questo piccolo programma che ha lo scopo di convertire da minuscolo a maiuscolo
in due differenti modi. Il problema è che quando si arriva all'istruzione *str = toupper( *str ); avviene un errore di segmentazione.


#include<stdio.h>

int main()
{
char vet[100] = "Hello, come va?";
char *str = "Hello, come va?";
int i = 0;

printf("La dim di vet è %d\nLa dim di str è %d\n", sizeof(vet[0]), sizeof(*str) );
while( vet[i] != '\0' )
{
vet[i] = toupper( vet[i] );
i++;

}
printf("Vet in maiuscolo: %s\n", vet );

while( *str != '\0' )
{
*str = toupper( *str );
++str;
}
printf("str in maiuscolo: %s\n", str );
}


L'output è questo:

La dim di vet è 1
La dim di str è 1
Vet in maiuscolo: HELLO, COME VA?
Segmentation fault

Perché mi da "Segmentation fault"?



P.S. Può essere irrilevante, ma uso come compilatore gcc.

Scara95
08-07-2012, 20:43
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main()
{
char vet[100] = "Hello, come va?";
char *str = (char *)malloc(sizeof(char)*strlen(vet));
strcpy(str, vet);
int i = 0;

printf("La dim di vet è %d\nLa dim di str è %d\n", sizeof(vet[0]), sizeof(*str) );
while( vet[i] != '\0' )
{
vet[i] = toupper( vet[i] );
i++;

}
printf("Vet in maiuscolo: %s\n", vet );

i = 0;
while( str[i] != '\0' )
{
str[i] = toupper( str[i] );
i++;

}
printf("str in maiuscolo: %s\n", str );
free(str);
return 0;
}

Così funziona!
Quel puntatore è un puntatore ad una costante di cui ovviamente non puoi modificare il valore!

MItaly
08-07-2012, 21:28
In effetti, scrivere


char * p = "una stringa";

è deprecato, dato che in realtà la stringa con cui lo stai inizializzando non è modificabile; la cosa corretta da fare è


const char * p = "una stringa";

in modo che il compilatore ti avvisi che non la puoi modificare già a compile-time.

Tronod'Ombra
08-07-2012, 21:53
Grazie delle risposte! Per adesso mi sembra di capire che il modo in cui ho inizializzato *str è equivalente ad inizializzare un puntatore variabile a dati costanti, da qui l'errore nel assegnare ad *str un valore. Tra l'altro mi è scappato che la maniera in cui incrementavo str nel ciclo while non mi avrebbe fatto stampare la stringa.
Beh, sarà bene che mi studi meglio l'argomento. Almeno adesso so più precisamente che parte studiare.

Loading