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);
}
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. –
Oh, und Ihre 'newWord' Funktion hat jedes Mal einen Speicherverlust von einem Byte, wenn sie aufgerufen wird. –
Mehrere Includes fehlen ebenfalls. 'nelem' ist nicht definiert. Ich frage mich immer noch, wie Sie dieses Stück Code kompilieren konnten ^^ – jboockmann