Esercizio C stringa

Messaggioda Salvy » 20/11/2022, 19:36

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 :

Codice:
#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
Salvy
Average Member
Average Member
 
Messaggio: 441 di 881
Iscritto il: 02/11/2017, 18:57

Re: Esercizio C stringa

Messaggioda Quinzio » 21/11/2022, 00:28

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
Codice:
#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'));
}
Quinzio
Cannot live without
Cannot live without
 
Messaggio: 5062 di 10547
Iscritto il: 24/08/2010, 06:50

Re: Esercizio C stringa

Messaggioda apatriarca » 21/11/2022, 08:06

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
Moderatore
Moderatore
 
Messaggio: 5704 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Esercizio C stringa

Messaggioda apatriarca » 21/11/2022, 08:11

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.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5705 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite