Esercizio C stringa

salvatoresambito
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 :

#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
Quinzio
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
#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'));
}

apatriarca
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.

apatriarca
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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.