SegFault 错误,但链表工作正常

SegFault error, but linked list works properly

我真的很想知道为什么程序编译和运行顺利,没有任何中断或不良结果,只是程序最后的 "SegFault"(以及另一个不需要的结果)。 该程序的任务是将单个字母按字母顺序放入链表中。这样的结构必须包含字母被检测到的次数,当然还有字母本身。

输入

swag

输出

aagsw Letter: a Frequency: 1 Letter: g Frequency: 1 Letter: s Frequency: 1 Letter: w Frequency: 1 Letter: � Frequency: 194 Segmentation Fault

不应该是这样应该是:

aagsw Letter: a Frequency: 1 Letter: g Frequency: 1 Letter: s Frequency: 1 Letter: w Frequency: 1

(Captain Obvious, 稍后谢谢我)

我给你密码。

问题已解决

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

typedef char string[30];

typedef struct nodo{
  char chara;
  int freq;
  struct nodo *next;
}Nodo;

typedef Nodo *Lista;

typedef struct{
  int value;
  char chara;
  int freq;
}Lettera;

Lista head;

void Creator(string stringa){

  Lettera letter[26];

  for(int i=0; i < strlen(stringa); i++){ //unnecessary part
    for(int j=0; j < strlen(stringa)-1; j++){
      if((int) stringa[j] > (int) stringa[j+1]){
        char tmp=stringa[j+1];
        stringa[j+1] = stringa[j];
        stringa[j] = tmp;
      }
    }
  }

  printf("%s\n",stringa);
  int k=97;
  for(int i=0; i<26; i++){  //initializing auxiliary struct
    letter[i].chara = (char) k;
    letter[i].value = k;
    letter[i].freq = 0;
    k++;
  }

  for(int i=0; i < strlen(stringa); i++){
    for(int j=0; j<26; j++){
      if(letter[j].chara == stringa[i]){
        letter[j].freq++;
      }
    }
  }

  Lista temp=NULL; //forgot to initialize

  for(int i=25; i>=0; i--){ //wrong index was i=26
    if(letter[i].freq>0){
      head=(Lista) malloc (sizeof(Nodo));
      head->chara = letter[i].chara;
      head->freq = letter[i].freq;
      head->next = temp;
      temp = head;
    }
  }
  while(head != NULL){
    printf("Letter: %c \tFrequency: %d\n", head->chara, head->freq);
    head = head->next;
  }
}

int main(){
  string stringa;
  scanf("%s",stringa);
  Creator(stringa);
}

再见,哈布拉斯

我们初学者应该互相帮助。:)

你的方法太复杂了。无需对输入的字符串进行排序。是添加到列表中时应该按顺序排列字母的列表。

而且还有bug。例如,您将数组 letter 声明为

Lettera letter[26];

所以索引的有效范围是[0, 26)。然而在这个循环中

  for(int i=26; i>=0; i--){
    if(letter[i].freq>0){
      head=(Lista) malloc (sizeof(Nodo));
      head->chara = letter[i].chara;
      head->freq = letter[i].freq;
      head->next = temp;
      temp = head;
    }
  }

您正在尝试访问索引等于 26 的不存在的元素。

这是一个演示程序,展示了如何将字母添加到列表中。

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

typedef struct nodo
{
    char chara;
    size_t freq;
    struct nodo *next;
} Nodo;

typedef Nodo *Lista;

void initialize( Lista *lista, const char *s )
{
    for ( ; *s; ++s )
    {
        char c = *s;

        if ( isalpha( ( unsigned char )c ) )
        {
            c = tolower( ( unsigned char )c );

            Nodo **nodo = lista;

            while ( *nodo != NULL && ( *nodo )->chara < c )
            {
                nodo = &( *nodo  )->next;
            }

            if ( *nodo == NULL || c < ( *nodo )->chara )
            {
                Nodo *current = malloc( sizeof( Nodo ) );
                current->chara = c;
                current->freq = 1;
                current->next = *nodo;
                *nodo = current;
            }
            else
            {
                ++( *nodo )->freq;
            }
        }           
    }
}

int main(void) 
{
    enum { N = 100 };

    Lista lista = NULL;

    char s[N];
    s[0] = '[=12=]';

    printf( "Enter a text: " );

    fgets( s, sizeof( s ), stdin );

    initialize( &lista, s );

    for ( Nodo *current = lista; current != NULL; current = current->next )
    {
        printf( "{ %c: %zu } ", current->chara, current->freq );
    }

    puts( "NULL" );

    return 0;
}

它的输出可能看起来像

Enter a text: Buona notte Habras
{ a: 3 } { b: 2 } { e: 1 } { h: 1 } { n: 2 } { o: 2 } { r: 1 } { s: 1 } { t: 2 } { u: 1 } NULL