Esercizio C stringa
Salve, devo scrivere un programma che modifichi una stringa sostituendo ogni carattere asterisco, con
un carattere scelto da input e che restituisca il numero di sostituzioni effettuate :
Visual Studio riporta il seguente errore :
Eccezione generata in corrispondenza di 0x00007FF780581813 in Project28.exe: 0xC0000005: violazione di accesso durante la scrittura del percorso 0x00007FF780589C2C.
Mi viene da pensare che probabilmente, quando faccio l'assegnamento, violo qualcosa, ma non so di preciso cosa. Idee?
Grazie
un carattere scelto da input e che restituisca il numero di sostituzioni effettuate :
#include<stdio.h> #include<string.h> int SostituisciAsterischiConCarattere(char S[],char Z) { int i, count = 0; for (i = 0; S[i] != 0; i++) { if (S[i] == '#') { count++; S[i]=Z; } } return count; } int main() { printf("%d", SostituisciAsterischiConCarattere("c#######ao",'o')); }
Visual Studio riporta il seguente errore :
Eccezione generata in corrispondenza di 0x00007FF780581813 in Project28.exe: 0xC0000005: violazione di accesso durante la scrittura del percorso 0x00007FF780589C2C.
Mi viene da pensare che probabilmente, quando faccio l'assegnamento, violo qualcosa, ma non so di preciso cosa. Idee?
Grazie
Risposte
La stringa questione viene allocata "in mezzo al codice", fa parte del codice, quindi e' fissa, non si puo' alterare, perche' e' una zona read-only di memoria.
Si deve fare in modo che la stringa sia nello heap (vedi esempio corretto qui sotto).
Leggi anche:
https://stackoverflow.com/questions/171 ... -parameter
Si deve fare in modo che la stringa sia nello heap (vedi esempio corretto qui sotto).
Leggi anche:
https://stackoverflow.com/questions/171 ... -parameter
#include<stdio.h> #include<string.h> char str[] = "c#######ao"; int SostituisciAsterischiConCarattere(char* S,char Z) { int i, count = 0; S[0] = 'a'; S[1] = 'a'; for (i = 0; S[i] != 0; i++) { if (S[i] == '#') { count++; S[i]=Z; } } return count; } int main() { printf("%d", SostituisciAsterischiConCarattere(str,'o')); }
In realtà entrambe le stringhe sono allocate insieme al programma, ma in zone diverse. Per poter modificare qualcosa devi dichiarare una variabile con quel valore, valori inseriti direttamente nel tuo programma come la tua stringa (ma anche una costante numerica se la passassi come puntatore) non possono essere modificati.
La principale ragione per cui non puoi modificarne il valore è che i valori di questo tipo sono spesso riutilizzati in diverse parti del codice. Ne viene quindi memorizzata una sola copia e ogni parte del codice che ne fa uso fa riferimento a quella copia.