Problema programma in C...
Ragazzi sto svolgendo questo esercizio, che mi deve contare il numero di volte in cui una parola è contenuta in una stringa. Il problema è questo: quando lo eseguo non mi fa inserire alcun carattere da cercare nonostante ci sia la scanf, e il carattere che viene selezionato(da solo) è 'undicesima lettera della frase che scrivo. Secondo voi quale è il problema???
#include<stdio.h> #include<stdlib.h> #define MAX 100 int conta(char *str); int main(){ char str[MAX], d; int cnt, i; printf("Inserire il testo\n"); for(i=0;i!='\n';++i){ d = scanf("%c",&d); str[i] = d; } cnt = conta(str); printf("Il numero di volte che si ripete e': %d\n", cnt); system("pause"); return 0; } int conta(char *str){ int i; int res=0; char c; printf("Inserire il carattere che si vuole cercare: \n"); scanf("%c",&c); printf("Il carattere e': %c\n",c); printf("\n"); for(i=0; i!='\0'; i++){ if(str[i]==c); res++; } return res; }
Risposte
Ciao,
dal testo del problema si deduce che devi cercare delle "parole".
Una parola è una sotto-stringa con uno o più caratteri. Te cerchi solo caratteri perciò non risolvi il problema che ti è posto.
secondo te cosa è l'iteratore "i" e cosa cerchi di confrontare nella condizione di ciclo?
"fk16":
Ragazzi sto svolgendo questo esercizio, che mi deve contare il numero di volte in cui una parola è contenuta in una stringa.
dal testo del problema si deduce che devi cercare delle "parole".
Una parola è una sotto-stringa con uno o più caratteri. Te cerchi solo caratteri perciò non risolvi il problema che ti è posto.
Il problema è questo: quando lo eseguo non mi fa inserire alcun carattere da cercare nonostante ci sia la scanf, e il carattere che viene selezionato(da solo) è 'undicesima lettera della frase che scrivo. Secondo voi quale è il problema???
for(i=0;i!='\n';++i){ ... for(i=0; i!='\0'; i++){ ...
secondo te cosa è l'iteratore "i" e cosa cerchi di confrontare nella condizione di ciclo?
Scusa c'è stato un errore mio...volevo intendere un carattere non una stringa....

"fk16":
Scusa c'è stato un errore mio...volevo intendere un carattere non una stringa....
ok, perciò hai capito il problema e lo hai scritto in codice.
Però il codice è sbagliato (in alcune parti), ti richiedo cosa non vai nell'impostazione dei cicli for?
nel primo ciclo l'errore potrebbe essere nell i!= ' \n ' poichè il compilatore si aspetti che vada a capo per terminare la stringa...nel secondo ciclo avevo in mente di confrontare se il carattere ce immetto da tastiera è uguale ad un elemento i-esimo dell'array(qui non capisco dove possa essere l'errore)
comunque mi sono accorto che è superfluo scrivere d = scanf(%c,&d) poichè posso srivere direttamente scanf("%c,"&d)
Non solo è superfluo, è proprio sbagliato scrivere
Il valore restituito da questa funzione è infatti uguale al numero di valori letti dallo standard input. In questo caso sarà quindi uguale a 0 o 1 a seconda che sia riuscito o meno a leggere il carattere (per cui è in pratica sempre 1). Ma scanf andrebbe evitato come la peste in questo e in praticamente tutti i casi (c'è un errore nel codice che usa lo scanf in questo link). Una soluzione migliore è senza dubbio la seguente:
Questa funzione è MOLTO più efficiente e più semplice da comprendere. Nota che non è necessario usare una variabile intermedia per poter scrivere in un buffer e che è necessario verificare che il numero di caratteri letti sia inferiore alla massima lunghezza della stringa. Ma non è in realtà necessario scrivere un ciclo usando getchar o scanf per leggere una riga di testo da standard input. E' sufficiente usare la funzione fgets presente in stdio.h come segue:
e str conterrà l'intera riga inserita dall'utente (o MAX-1 caratteri di questa riga nel caso in cui la riga sia troppo lunga per essere inserita nella stringa).
Nel seguente ciclo:
C'è un punto e virgola di troppo dopo l'if. Eliminalo.
d = scanf("%c", &d);
Il valore restituito da questa funzione è infatti uguale al numero di valori letti dallo standard input. In questo caso sarà quindi uguale a 0 o 1 a seconda che sia riuscito o meno a leggere il carattere (per cui è in pratica sempre 1). Ma scanf andrebbe evitato come la peste in questo e in praticamente tutti i casi (c'è un errore nel codice che usa lo scanf in questo link). Una soluzione migliore è senza dubbio la seguente:
d = getchar();
Questa funzione è MOLTO più efficiente e più semplice da comprendere. Nota che non è necessario usare una variabile intermedia per poter scrivere in un buffer e che è necessario verificare che il numero di caratteri letti sia inferiore alla massima lunghezza della stringa. Ma non è in realtà necessario scrivere un ciclo usando getchar o scanf per leggere una riga di testo da standard input. E' sufficiente usare la funzione fgets presente in stdio.h come segue:
fgets(str, MAX, stdin);
e str conterrà l'intera riga inserita dall'utente (o MAX-1 caratteri di questa riga nel caso in cui la riga sia troppo lunga per essere inserita nella stringa).
Nel seguente ciclo:
for(i=0; i!='\0'; i++){ if(str[i]==c); res++; }
C'è un punto e virgola di troppo dopo l'if. Eliminalo.
"apatriarca":
Nel seguente ciclo:
for(i=0; i!='\0'; i++){ if(str[i]==c); res++; }
C'è un punto e virgola di troppo dopo l'if. Eliminalo.
Oltre questo, l'iteratore "i" viene valutato con un char, perciò in questo uscirà immediatamente dal ciclo per la corrispondenza tra char e numeri interi $[0-254]$
Basterà modificare con $str!='0'$.
"hamming_burst":
Oltre questo, l'iteratore "i" viene valutato con un char, perciò in questo uscirà immediatamente dal ciclo per la corrispondenza tra char e numeri interi $[0-254]$
Basterà modificare constr[i]!='0'.
Sì, non l'avevo notato.