PDA

Visualizza la versione completa : C sostituire char all'interno di un vettore


kingston
18-06-2014, 17:45
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>


int main (void)
{
const MAX_DIM=100;
int n,i;
char car1, car2;
do{
printf("\nQuanti elementi vuoi che contenga il tuo vettore?\t");
scanf("%d", &n);
if((n<=0)||(n>MAX_DIM))
printf("\nerrore");
}while((n<=0)||(n>MAX_DIM));
char vett[MAX_DIM];
for(i=0; i<n; i++)
{
printf("\nInserisci il carattere %d:\t", i+1);
scanf("%s", &vett[i]);
}
printf("\nInserisci il carattere che verra sostituito:\t");
scanf("%s", &car1);
printf("\nInserisci il carattere sostituto:\t");
scanf("%s", &car2);
for(i=0; i<n; i++)
{
if(vett[i]==car1)
vett[i]=car2;
}
for(i=0; i<n; i++)
printf("\t %c", vett[i]);
}

ciao a tutti, scusate ma non capisco perchè il programma non mi legge l'ultimo ciclo for.. sono impazzita io?? dove sbaglio?? il programma deve sostituire all'interno di un vettore tutte le occorrenze di car1 con car2.. perchè alla fine non riesco a visualizzare il vettore??:dhò:

Scara95
18-06-2014, 18:37
Per quanto il tuo codice potrebbe funzionare in specifici casi (tutta fortuna), è certamente sbagliato. Infatti dovresti usare %s solamente per la lettura di parole intere. Per l'input di singoli caratteri è preferibile usare tecniche diverse.

kingston
18-06-2014, 20:13
certamente hai ragione ma con il %c vengono visualizzate a due a due le istruzioni all'interno del for.. es: nel primo ciclo mi appare: inserisci elemento 1:
inserisci elemento 2:_

non capisco.. che dovrei mettere??

Scara95
18-06-2014, 21:45
Il problema è che scanf lascia sporco il buffer. Utilizza il seguente codice
void clear_buffer(void) {
while(getchar() != '\n');
}
char char_in(void) {
char tmp = getchar();
clear_buffer();
return tmp;
}
Aggiungi un clear_buffer(); dopo il ciclo che legge n e sostituisci le letture dei caratteri con variabile = char_in();

torn24
19-06-2014, 05:38
Se vuoi creare un array di dimensioni dipendenti da un input , dovresti usare un puntatore e allocazione dinamica .
in c le variabili dovrebbero essere dichiarate a inizio funzione , compilatori meno permissivi di quello che stai usando genererebbero un
errore .

}while((n<=0)||(n>MAX_DIM));
char vett[MAX_DIM];

Scara95
19-06-2014, 06:40
Se vuoi creare un array di dimensioni dipendenti da un input , dovresti usare un puntatore e allocazione dinamica .
Non è necessario se prevede un massimo come lei ha fatto e controlla di non sforare questo massimo. Certo, così il programma è soggetto ad alcune limitazioni, ma è pienamente corretto.


in c le variabili dovrebbero essere dichiarate a inizio funzione , compilatori meno permissivi di quello che stai usando genererebbero un
errore .

}while((n<=0)||(n>MAX_DIM));
char vett[MAX_DIM];

Scorretto: in C99 puoi dichiarare variabili (quasi) in ogni luogo. In C89 dovrebbero essere dichiarate solo all'inizio del blocco, ma praticamente tutti i compilatori supportano una dichiarazione a metà blocco (sebbene non tutti nella prima clausola del for).

Edit: notare comunque che si parla di blocco, non funzione.

Se avessi tempo ti cercherei i passi dello standard, ma questi due thread su SO vanno bene pure:
http://stackoverflow.com/questions/2321564/where-can-i-legally-declare-a-variable-in-c99
http://stackoverflow.com/questions/288441/variable-declaration-placement-in-c

torn24
19-06-2014, 06:59
In visual studio "non so che standard adotti ", non è eseguibile quel codice .....


Poi mio parere personale "discutibile" , se si adotta lo standard ansi c89 , il programma sarà sempre compilato correttamente .


ma poi accetto , quello che dicono i professionisti , ci mancherebbe.

Scara95
19-06-2014, 07:21
In realtà il modo migliore per avere supporto è scrivere ne subset C dato dall'intersezione C/C++ (Chiamato anche clean C alcune volte). In questo modo puoi sfruttare la maggioranza dei compilatori.

In ogni caso Visual Studio supporta le difinizioni a metà blocco se non compili con pedantic (almeno a quanto mi risulta).

Loading