我正在从控制台中读取一些单词,将它们放在列表中,然后打印它们。出于某种原因,如果我键入类似的内容
qwertyu qwertyu
它打印"第一个单词:qwertyu//第二个单词:q wertyu"
但是如果我输入
qwertyuiqwertyui
它打印"第一个单词:qwertyuiqwertyui//第二个单词:q wertyui"
任何超过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: %sn",&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("adicionein");
}
}
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: %dn",fim[p].caracs,fim[p].freq);
}
free(lista); //Libera a memoria usada nas listas
free(temp);
free(fim);
}
您需要为分配的每个结构中的carcs值分配内存。
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);
}