Problema programma in C...

fk16
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
hamming_burst
Ciao,


"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?

fk16
Scusa c'è stato un errore mio...volevo intendere un carattere non una stringa.... :(

hamming_burst
"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?

fk16
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)

fk16
comunque mi sono accorto che è superfluo scrivere d = scanf(%c,&d) poichè posso srivere direttamente scanf("%c,"&d)

apatriarca
Non solo è superfluo, è proprio sbagliato scrivere
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.

hamming_burst
"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'$.

apatriarca
"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 con
str[i]!='0'
.

Sì, non l'avevo notato.

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