2010-11-30 49 views
0

J'écris un algorithme en C avec netbeans pour trouver des astérisques dans une chaîne.Recherche de caractères dans une chaîne en C

int main() { 
    int M=0, i, j; 
    scanf("%i",&M); 
    int pos[M]; 
    char c[M]; 
    scanf("%s", c); 

    i=0; 
    j=1; 

    while(c[i] != '\0'){ 
     if(c[i]=='*'){ 
      pos[j] = i; 
      j++; 
     } 
     i++; 
    } 

    printf("Asterisks in positions: \n\n"); 

    for(j=1; j<=i; j++){ 
     printf("%i", pos[j]); 
    } 
    return 0; 
} 

Mais cela ne fonctionne pas, il imprime beaucoup de chiffres, même si M est un petit nombre.

+0

Vous n'avez pas posé de question. StackOverflow est un endroit pour obtenir des réponses aux questions. – abelenky

+0

Quelle entrée donnez-vous à votre programme? Quel résultat obtenez-vous? Quel résultat attendez-vous? – abelenky

Répondre

1

Les informations concernant le nombre d'astérisques que vous avez trouvé est stocké dans le compteur j. Cette variable se réinitialiser dans la boucle:

for(j=1; j<=i; j++) 

De plus, cette boucle va tout le chemin jusqu'à i, qui est la longueur de la chaîne d'entrée votre. Essayez de retravailler votre boucle comme suit:

for(i=1; i<j; i++){  
    printf("%i", pos[i]);  
} 
2

Le problème semble être que vous ne prenez jamais en compte le nombre de caractères trouvés. Vous imprimez le vecteur entier, en utilisant i au lieu de j pour itérer. C'est j qui contient le nombre de matchs.

Aussi, essayez d'utiliser strchr, de cstring :)

Obtenez la première position, puis recherchez à nouveau le caractère suivant jusqu'à ce que NULL est renvoyée.

+2

Ou 'strcspn()' qui renvoie le nombre de caractères ignorés. –

0

Après votre boucle while terminée, j détient le nombre total de positions enregistrées, vous devez donc être l'impression à partir pos[1] à pos[j]. Votre boucle actuelle imprime de pos[1] à pos[i]. Il suffit d'inverser les variables dans votre boucle finale:

for(i=1; i<=j; i++){ 
    printf("%i", pos[i]); 
}