2016-04-16 11 views
-2

Ich lese einige Wörter aus der Konsole, lege sie in eine Liste und drucke sie dann. Aus irgendeinem Grund, wenn ich schreibe so etwas wieProbleme mit scanf, wenn ein Wort größer als 7 Zeichen ist

qwertyu qwertyu

druckt "1. Wort: qwertyu // 2. Wort: qwertyu".
Aber wenn ich tippe

qwertyui qwertyui

druckt "1. Wort: qwertyuiqwertyui // 2. Wort: qwertyui".
Jedes Wort, das länger als 7 Zeichen ist, bewirkt, dass es sich selbst klont und ich habe keine Ahnung, warum es passiert.

Hier einige meiner Code:

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

int total_pal = 2000; //Total de palavras 
int nelem = 0; //Numero de elementos da lista LISTA 
int numero = 0; //Numero de elementos da lista FIM 

typedef struct Palavra{ //Criando uma estrutura pra palavra 
    char *caracs; //Consiste de caracteres 
    int freq; //e sua freqência 

}Palavra; 

Palavra *lista; //Lista de palavras 
Palavra *fim; //Lista de palavras depois do parse 
Palavra *temp; //Lista temporaria para fazer ondernação 

/*struct Palavra *newPalavra(char *caracs, int freq){ 
    struct Palavra *palavra = malloc(sizeof(struct Palavra)); //Alocando memoria pra palavra 
    if (palavra == NULL) 
     printf("Deu erro no malloc de palavra!"); 

    palavra->caracs = malloc (sizeof(char)); //Alocando memoria pros caracteres da palavra 
    if(palavra->caracs == NULL){ 
     free(palavra); 
     printf("Deu erro no malloc de caracter!"); 
    } 

    palavra->caracs = strdup(caracs); //Define os caracteres dentro da estrutura como o char passado na chamada 
    palavra->freq = freq; //Mesma coisa com a frequencia 
    return palavra; 
}*/ 

int busca(Palavra *fim, char *palavra){ //Busca palavra na lista 
    int l = 0; 
    while(l<numero && strcmp(fim[l].caracs, palavra) != 0){ //Equanto i for menor do que o numero total de palavras existentes e a palavra na lista for diferente da palavra procurada 
     l++; //Vai somando até achar ou não a palavra 
    } 
return l; //retorna posição 
} 

void troca(Palavra *lista, int i, int j){ //Usada na ordenação 
    *temp = lista[i]; 
    lista[i] = lista[j]; 
    lista[j] = *temp; 
} 

void ordena(Palavra *fim,int nelem){ //Ordena a lista fim em ordem decrescente de frequência 
    for(int i = 0;i<(nelem-1);i++){ 
     for(int j = (i+1);j<nelem;j++){ 
      if (fim[i].freq<fim[j].freq){ 
       troca(fim,i,j); 
      } 
     } 
    } 
} 

void alfabetica(Palavra *lista,int nelem){ 
    for (int i = 1; i < nelem; i++) { 
     for (int j = 1; j < nelem; j++) { 
     if (strcmp(&lista[j-1].caracs, &lista[j].caracs) > 0) { 
      troca(lista,j,j-1); 
     } 
     } 
    } 
} 

int main(){ 
    lista= malloc(sizeof(struct Palavra)*total_pal); //Aloca memoria pra lista usada pro scanf 
    if (lista == NULL) 
     printf("Deu erro!"); 

    temp= malloc(sizeof(struct Palavra)); //Aloca memoria pra lista temporaria usada na ordenação 
    if (lista == NULL) 
     printf("Deu erro!"); 

    fim= malloc(sizeof(struct Palavra)*total_pal); //Aloca memoria pra lista final 
    if (fim == NULL) 
     printf("Deu erro!"); 

    while(scanf("%s",&lista[nelem].caracs)!= EOF){ //Le input do console até chegar um EOF e adiciona tudo na lista 
     nelem++; 
    } 

    alfabetica(lista,nelem); //Ordena a lista em ordem alfabetica 

    for(int p=0;p<nelem;p++){ //Imprime as palavras junto com suas frequências 
     printf("Palavra: %s\n",&lista[p].caracs); 
    } 

    for(int k = 0;k<nelem;k++){ 
     int pos = busca(fim,&lista[k].caracs); 

     if(pos != numero){ //Palavra já consta 
      fim[pos].freq++; //Incrementa a frequência dela 

     } 
     else if (numero == total_pal){ 
      printf("overflow!"); 
     } 
     else if(pos == numero){ //Palavra não consta 
      fim[pos].caracs = &lista[k].caracs; //Define a palavra na posição correta na lista fim como o pch 
      fim[pos].freq = 1; //Define sua frequencia como 1 
      numero++; 
      //printf("adicionei\n"); 
     } 
    } 

    ordena(fim,numero); //Ordena a lista fim por frequencia 

    for(int p=0;p<numero;p++){ //Imprime as palavras junto com suas frequências 
     printf("Palavra: %s Frequencia: %d\n",fim[p].caracs,fim[p].freq); 
    } 

    free(lista); //Libera a memoria usada nas listas 
    free(temp); 
    free(fim); 
} 
+2

Was ist 'Palavra'? Wo ordnen Sie Speicher für die Zeichenfolge zu? Sie rufen 'newWord' nicht irgendwo auf, wo es scheint? Und wenn 'lista' ein Array von' Wort'-Strukturen ist, dann gibt der Ausdruck '& lista [nelem] .caracs' Ihnen einen Zeiger * auf den Zeiger *' caracs' (dh es ist der Typ 'char **') was nicht 'scanf' erwartet. Ein guter Compiler kann dies erkennen und Sie davor warnen. –

+1

Oh, und Ihre 'newWord' Funktion hat jedes Mal einen Speicherverlust von einem Byte, wenn sie aufgerufen wird. –

+0

Mehrere Includes fehlen ebenfalls. 'nelem' ist nicht definiert. Ich frage mich immer noch, wie Sie dieses Stück Code kompilieren konnten ^^ – jboockmann

Antwort

0

Sie müssen Speicher für den caracs Wert in jeder Struktur zuzuordnen, die Sie zuordnen.

lista= malloc(sizeof(struct Palavra)*total_pal); 
int i; 
const int SIZE_STR = 100; 
for (i = 0; i < total_pal; i++) { 
    lista[i].caracs = malloc(sizeof(char) * SIZE_STR); 
}