2015-09-30 1 views
0
#include<stdlib.h> 
#include<stdio.h> 
#define NO_OF_CHARS 256 

/* Returns an array of size 256 containg count 
    of characters in the passed char array */ 
int *getCharCountArray(char *str) 
{ 
    int *count = (int *)calloc(sizeof(int), NO_OF_CHARS); 
    int i; 
    for (i = 0; *(str+i); i++) 
     count[*(str+i)]++; 
    return count; 
} 

/* The function returns index of first non-repeating 
    character in a string. If all characters are repeating 
    then returns -1 */ 
int firstNonRepeating(char *str) 
{ 
    int *count = getCharCountArray(str); 
    int index = -1, i; 

    for (i = 0; *(str+i); i++) 
    { 
    if (count[*(str+i)] == 1) 
    { 
     index = i; 
     break; 
    } 
    } 

    free(count); // To avoid memory leak 
    return index; 
} 

/* Driver program to test above function */ 
int main() 
{ 
    char str[] = "geeksforgeeks"; 
    int index = firstNonRepeating(str); 
    if (index == -1) 
    printf("Either all characters are repeating or string is empty"); 
    else 
    printf("First non-repeating character is %c", str[index]); 
    getchar(); 
    return 0; 
} 

Je ne peux pas saisir les lignes suivantes:Pointer De-référencement

count[*(str+i)]++; 

amd

int *getCharCountArray(char *str) 
    { 
     int *count = (int *)calloc(sizeof(int), NO_OF_CHARS); 
     int i; 
     for (i = 0; *(str+i); i++) 
      count[*(str+i)]++; 
     return count; 
    } 

Le programme est utilisé pour trouver le premier caractère non répétitif dans la chaîne .

+0

Qu'est-ce que vous voulez exactement faire? – naggarwal11

+0

La ligne compte le nombre de fois qu'un même caractère a été trouvé dans une chaîne donnée. – Gangadhar

+0

@Gangadhar Je sais ce que ça fait mais comment? C'est ma question. Si vous pouviez le simplifier. – HellHammer

Répondre

0

Je ne peux pas saisir les lignes suivantes:

count[*(str+i)]++; 

travail de l'extérieur:

  • depuis str est un pointeur vers char et i est un int, str + i est un pointeur vers le char qui est i caractères après celui str lui-même pointe à
  • *(str+i) dereferences pointeur str+i, ce qui signifie qu'il évalue à char le pointeur pointe vers. Ceci est exactement équivalent à str[i].
  • count[*(str+i)] utilise char à l'index i dans la chaîne str en tant qu'index dans le tableau dynamique count. L'expression désigne le int à cet index (puisque count pointe vers un tableau de int s). Voir aussi ci-dessous.
  • count[*(str+i)]++ évalue au int à l'index *(str+i) dans le tableau count points à. En tant qu'effet secondaire, il incrémente cet élément de tableau de un après la valeur de l'expression is determined. Cette expression globale est présente dans votre code exclusivement pour son effet secondaire.

Il est important de noter que bien que l'espace est réservé dans le tableau count pour compter des apparitions de 256 char distinctes des valeurs, l'expression vous a demandé n'est pas un moyen sûr de compter tous les. En effet, le type char peut être implémenté en tant que type signé (à la discrétion de l'implémenteur C), et il est courant qu'il soit implémenté de cette manière. Dans ce cas, seules les valeurs non négatives char correspondent aux éléments du tableau, et un comportement indéfini se produira si la chaîne d'entrée en contient d'autres. Safer serait:

#include <stdint.h> 

# ... 

count[(uint8_t) *(str+i)]++; 

à-dire le même que l'original, sauf pour la coulée explicitement chaque caractère de la chaîne d'entrée à un non signé valeur de 8 bits.

Dans l'ensemble, la fonction crée simplement un tableau de 256 int s, un pour chaque valeur possible char et balaye la chaîne à compter le nombre d'occurrences de chaque valeur char qui apparaît en elle. Il renvoie ensuite ce tableau de nombre d'occurrences.

0

Ce code est équivalent à la boucle confuse que vous avez affichée. Aide-t-il?

*(str + i) est une façon confuse d'exprimer str[i] et IMO inapproprié ici.

for (i = 0; str[i] != '\0'; ++i) 
{ 
    char curr_char = str[i]; 
    ++count[curr_char]; 
} 
0

En boucle, il y a trois choses que nous devons considérer: (i. Dans votre exemple)

  • Explication de boucle

  • Initialisation de variable compteur. 2) Condition (* (str + i)) 3) Incrément/décrémentation (i ++).

  • la boucle for est exécutée jusqu'à ce que la condition soit vraie (c'est-à-dire toute valeur non nulle). si * (str + i) fournit une valeur non nulle jusqu'à ce que tous les caractères de la matrice ..

    count[*(str+i)]++; // it is counting the number of characters in the array by incrementing the string character by character. 
    
1

*(str+i) est identique à str[i]. La ligne:

for (i = 0; *(str+i); i++) 

est le même que:

for (i = 0; str[i]; i++) 

Les déclarations contenues dans la boucle seront exécutées tant que str[i] est évaluée à non nul. Puisque les chaînes C sont des tableaux de caractères terminés par un caractère nul, la boucle for sera exécutée pour chaque caractère dans str. Il s'arrêtera lorsque la fin de la chaîne sera atteinte.

count[*(str+i)]++; 

est le même que:

count[str[i]]++; 

Si str[i] est 'a', cette ligne incrémenter la valeur de count['a'], qui est count[97] dans le codage ASCII.

À la fin de la boucle, count sera rempli d'entiers qui représentent le nombre de fois qu'un caractère particulier apparaît dans str.

+1

Résolu mon problème. Je ne viens pas de me frapper! – HellHammer

+0

L'une des conséquences de 'str [i]' étant le même que '* (str + i)', c'est que 'str [i]' est également le même que 'i [str]'. – ninjalj

0
count[*(str+i)]++ =>count[*(str+i)]=count[*(str+i)]+1 

Considérons maintenant un scénario:

char str[] = "aaab"; 

*(str+i)/str[i] Will show char like 'a','b'...etc. 

Alors

count[*(str+i)]++=count['a']++ Mean; 
    count['a']=count['a']+1 // Will store iteration of a=1 

    count['a']=count['a']+1 // Will Update iteration of a=2 

    count['a']=count['a']+1 // Will Update iteration of a=3 

et comme un autre caractère. Donc count[*(str+i)]++ mettra à jour occrance de charcarter dans mis à jour count.