- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
大家好,我正在做一个项目,我不断收到“库是空的”,然后是段错误,用 gdb 运行它告诉我错误出在我的 count_list 函数中。但我似乎无法弄清楚为什么?任何提示将不胜感激它让我如此接近完成并挂断了这个。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Assume max char count in file */
#define MAX 20
/* library struct - DO NOT CHANGE */
typedef struct library
{
char *genre;
char *band;
char *album;
float rating;
struct library *next;
}Library;
/* Function Prototypes - DO NOT CHANGE */
Library *Read_File(FILE *);
void Print(Library *);
Library *Create_List(Library *, Library *);
Library *Create_Album(char *, char *, char *, float);
Library *Merge(Library *, Library *);
int Count_List(Library *);
void Split_List(Library *, Library **, Library **);
Library *Merge_Sort(Library *);
Library *Delete_Genre(Library *);
void Free_Entry(Library *);
Library *Clean(Library *);
/* MAIN
* Error check file parameter
* Call Read_File to fill our list
* Print our list
* Merge Sort the linked list (by genre)
* Delete a genre
* Free the list
*/
int
main(int argc, char **argv)
{
if(argc != 2)
{
printf("Not enough arguments.\n");
return 0;
}
FILE *fp = NULL;
if((fp = fopen(argv[1], "r")) == NULL)
{
printf("File can not be opened.\n");
return 0;
}
Library *Head = NULL;
Head = Read_File(fp);
Print(Head);
Merge_Sort(Head);
Print(Head);
Head = Delete_Genre(Head);
Print(Head);
Head = Clean(Head);
Print(Head);
return 0;
}
/* Clean()
* Delete the linked list, recursively
*/
Library *
Clean(Library *Head)
{
if(Head) return NULL;
Library *Tmp = Head->next;
Free_Entry(Head);
Clean(Tmp->next);
}
/* Free_Entry()
* wrapper function to free a struct Library
*/
void
Free_Entry(Library *Entry)
{
free(Entry);
}
/* Delete_Genre()
* Deletes a genre inputted by user
* Logic:
* prompt user for genre input
* traverse list deleting all structs that contain the genre
*/
Library *
Delete_Genre(Library *Head)
{
if(!Head)
{
printf("List Empty.\n");
return NULL;
}
char *input = malloc(MAX * sizeof(char *));
Library *Current = Head;
Library *Tail = NULL;
printf("Which genre would you like to delete?\n");
scanf("%s", input);
while(Current)
{
if(strcmp(Current->genre, input))
{
if(Current = Head)
{
Head = Head->next;
Free_Entry(Current);
Current = Head;
}
else
Tail->next = Current->next;
}
else
Current = Current->next;
}
}
/* Read_File()
* Open file fp
* Create a struct from information in text file
* Link our list with newly created struct
*/
Library *
Read_File(FILE *fp)
{
Library *Head, *Entry;
Head = Entry = NULL;
char *genre, *band, *album;
float rating;
while(1)
{
fscanf(fp, "%s %s %s %f", &genre, &band, &album, &rating);
if(!feof(fp))
break;
Entry = Create_Album(genre, band, album, rating);
Head = Create_List(Entry, Head);
}
return Head;
}
/* Print()
* Print the linked list
*/
void
Print(Library *Head)
{
if(!Head)
{
printf("Library is empty.\n");
return;
}
while(Head)
{
printf("%20s %20s %20s %20.2f \n",
Head->genre, Head->band, Head->album, Head->rating);
Head = Head->next;
}
printf("\n\n");
//return Head;
}
/* Create_Album
* Create a struct and assign the given args to it as appropriate
*/
Library *
Create_Album(char *genre, char *band, char *album, float rating)
{
Library *Entry = malloc(sizeof(Library));
strcpy(Entry->genre, genre);
strcpy(Entry->band, band);
strcpy(Entry->album, album);
Entry->rating = rating;
Entry->next = NULL;
return Entry;
}
/* Create_List()
* Push Entry onto our List
*/
Library *
Create_List(Library *Head, Library *Entry)
{
if(!Head)
return Entry;
Entry->next = Head;
return Entry;
}
/* Merge_Sort()
* Recursively split our list between Left and Right
* Merge our Left and Right lists
*/
Library *
Merge_Sort(Library *Head)
{
Library *Tmp = Head;
Library *Left, *Right, *Result;
Left = Right = Result = NULL;
int count = Count_List(Head);
if(count = 1)
return Tmp;
Left = Merge_Sort(Left);
Right = Merge_Sort(Right);
Result = Merge(Left, Right);
return Result;
}
/* Split_List()
* split our list in half
*/
void
Split_List(Library *Head, Library **Left, Library **Right)
{
int size = Count_List(Head);
int i;
Library *Tmp = Head;
*Left = Head;
for(i=1; i<size/2; ++i)
Tmp=Tmp->next;
*Right = Tmp->next;
Tmp->next = NULL;
}
/* Merge()
* Merge two linked lists Left and Right together in sorted order
*/
Library *
Merge(Library *Left, Library *Right)
{
Library *Result, *Tmp;
Result = Tmp = NULL;
if(strcmp(Left->genre, Right->genre) <= 0)
{
Result = Left;
Left = Left->next;
}
else
{
Result = Right;
Right = Right->next;
}
Tmp = Result;
while(Left != NULL && Right != NULL)
{
if(Left != NULL && Right!= NULL)
{
if (strcmp(Left->genre, Right->genre) <= 0)
{
Tmp->next = Left;
Left = Left->next;
}
else
{
Tmp->next = Right;
Right = Right->next;
}
Tmp = Tmp->next;
}
}
return Result;
}
/* Count_List()
* Count the number of elements in a linked list
*/
int
Count_List(Library *Head)
{
Library *Tmp = Head;
int count = 0;
while(Tmp->next != NULL)
{
count++;
Tmp = Tmp->next;
}
}
最佳答案
观察,
Count_List() 应该对列表中的每个元素进行计数,您的版本只从列表中的第二个项目开始计数。它应该总是返回一个 int,
int
Count_List(Library *Head)
{
int count = 0;
Library *Tmp = Head;
if(!Tmp) return(count);
while(Tmp != NULL)
{
count++;
Tmp = Tmp->next;
}
return(count);
}
在 Read_File() 中调用 Create_List(Entry,Head),但函数签名为 Create_List(Head,Entry);你想要哪个?可能是(头,条目)。使用 fgets 和 sscanf 读取文件,
Library *
Read_File(FILE *fp)
{
Library *Head, *Entry;
Head = Entry = NULL;
char genre[100], band[100], album[100];
float rating;
char line[100];
while(fgets(line,sizeof(line),fp)
{
sscanf(line,"%s %s %s %f", genre, band, album, &rating);
Entry = Create_Album(genre, band, album, rating);
Head = Create_List(Head,Entry);
}
return Head;
}
查看 Create_List(),您似乎将 List 实现为堆栈(将 Entry 插入列表头部),
Library *
Create_List(Library *Head, Library *Entry)
{
if(!Head)
return Entry;
Entry->next = Head;
return Entry;
}
Create_Album() 在为成员变量赋值之前需要检查 malloc 是否成功,
Library *Entry=NULL;
if( !(Entry=(Library*)malloc(sizeof(Library))) )
{
printf("error creating album\n");fflush(stdout);
return Entry;
}
说到 Library struct,你将成员 genre,band,album 声明为指针,但你需要空间来复制内存,例如,
typedef struct library
{
char genre[50];
char band[50];
char album[50];
float rating;
struct library *next;
}Library;
我的建议是构建构造函数和析构函数 LibraryNew、LibraryDel。
检查 (argc<2) 个参数(您的消息说不够,而不是需要 2 个,
if(argc < 2)
{
printf("Not enough arguments.\n");
return 0;
}
这解决了最大的问题,
./library music.x 2
line:Rock Antrax Party 1.2
Rock,Antrax,Party,1.200000
Rock,Antrax,Party,1.200000
added: Rock,Antrax,Party,1.200000
Rock Antrax Party 1.20
Rock Antrax Party 1.20
Which genre would you like to delete?
关于c - 库为空然后段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19394223/
Java 库和 android 库有什么区别,各自有什么优点/缺点? 最佳答案 您可以在 Android 应用程序中包含标准 Java .jar 文件库。它们在 .apk 构建时被翻译成 Dalvik
所以,我现在的代码就像从 Java 层加载库(比如 liba.so),并在内部 liba.so 加载 libb.so。因此,如果我必须将所有库打包到 APK 中并将其安装在没有 root 访问权限的设
我想在我的系统中设置 LEDA 库。 我已经从以下链接下载了 LEDA 库 http://www.algorithmic-solutions.info/free/d5.php Instruct
我想用 autoconf 创建一个共享库。但是,我希望共享库具有“.so”扩展名,而不是以“lib”开头。基本上,我想制作一个加载 dlopen 的插件。 .是否有捷径可寻? 当我尝试使用 autoc
我需要在 Apps 脚本应用程序上修改 PDF。为此,我想使用 JS 库:PDF-LIB 我的代码: eval(UrlFetchApp.fetch("https://unpkg.com/pdf-lib
我正在构建一个使用以下 Boost header 的程序(我使用的是 Microsoft Visual C++ 10), #include #include #include #include
当我通过 cygwin 在 hadoop 上运行此命令时: $bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+' 我
我已经通过 vcpgk 成功安装了一个 C++ 库,名为:lmdb:x64-windows 我还安装了lmdb通过 Cabal 安装的 Haskell 绑定(bind)包 在尝试测试 lmdb 包时:
我该如何解决这个问题? 我刚刚将 javacv jar 文件复制到我的项目 Lib 文件夹下,但出现了这个错误! 我可以找到这个thread来自谷歌,但不幸的是,由于我国的谷歌限制政策,该页面无法打开
我有一个 Android 库项目 FooLib。 FooLib 引用 Android Context 之类的东西,但不需要任何资源文件(res/ 中的东西)所以我目前将其打包为供我的应用使用的 JAR
我正在开发一个 Android 应用程序(使用 Android Studio),它能够通过手势识别算法了解您正在进行的 Activity 。对于我使用 nickgillian ithub 帐户上可用的
关于从 .NET Framework 项目中引用 .NET Standard 类库的问题有很多类似的问题,其中 netstandard 库中的 NuGet 包依赖项不会流向 netframework
我已经从互联网上下载了 jna-4.2.2.jar,现在想将这个 jar 导入到我的项目中。但是当我试图将这个 jar 导入我的项目时,出现以下错误。 [2016-06-20 09:35:01 - F
我正在尝试通过编译在 Mac 上安装 rsync 3.2.3。但是,我想安装所有功能。为此,它需要一些库,此处 ( https://download.samba.org/pub/rsync/INSTA
进入 Web 开发有点困难。过去 5 年我一直致力于 winforms 工作。所以我正在努力从一种切换到另一种。前段时间,我使用过 JavaScript,但现在还没有大量的 JavaScript 库
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我正在寻找一个用Python编写的与logstash(ruby + java)类似的工具/库。 我的目标是: 从 syslog 中解析所有系统日志 解析应用程序特定日志(apache、django、m
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我花了几天时间试图寻找用于 JavaPOS 实现的 .jar 库,但我找不到任何可以工作的东西。我找到了很多像这样的文档:http://jpos.1045706.n5.nabble.com/file/
这个问题在这里已经有了答案: Merge multiple .so shared libraries (2 个答案) 关闭 9 年前。 我有我在代码中使用的第三方库的源代码和对象。该库附带有关如何使
我是一名优秀的程序员,十分优秀!