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
我真的很想知道为什么程序编译和运行顺利,没有任何中断或不良结果,只是程序最后的 "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