2016-04-16 13 views
-2

私はコンソールからいくつかの単語を読んでリストに入れてから印刷しています。何らかの理由で、私は単語が7文字より大きい場合scanfに問題がある

qwertyu qwertyu

それが印刷さような何か入力すると、 "第一の単語を:qwertyu //第二の単語:qwertyu"を。
しかし、私は

qwertyui qwertyui

を入力した場合、それは"第一単語:qwertyuiqwertyui // 2番目のワード:qwertyui" 印刷しを。
7文字より長い単語は、それ自体がクローンしてしまい、なぜそれが起こっているのかわかりません。

#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

「Palavra」とは何ですか?文字列にはどこにメモリを割り当てますか?あなたはどこでも 'newWord'を呼び出すことはありませんか?そして 'lista'が' Word'構造体の配列であれば、 '&lista [nelem] .caracs'はポインタ* caracsにポインタ*を与えます(つまり、' char ** '型です) 'scanf'が期待するものではありません。良いコンパイラがそれを検出して警告を出すことができます。 –

+1

ああ、あなたの 'newWord'関数は呼び出されるたびに1バイトのメモリリークを持っています。 –

+0

複数のインクルードも欠けています。 'nelem'は定義されていません。私はまだあなたがこのコードをどのようにコンパイルできたのか疑問に思っています^^ – jboockmann

答えて

0

あなたは割り当て、各構造体にcaracs値のためにメモリを割り当てる必要があります。ここでは

は、私のコードの一部です。

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); 
} 
関連する問題