我有这个程序可以从文件中提取书籍数据(书名、isbn、作者和出版商),然后填充 3 个结构。这些结构都已正确填充,并且按字母顺序打印所有书籍的命令“t”工作正常。所以在那之前一切都有效,但如果我尝试使用“i'isbn'”(例如:i 9780321942050)命令它不起作用。它打印出一些奇怪的字符,我已经尝试了大脑功能范围内的所有方法来尝试修复它,但没有任何效果。据我所知,问题出在 vecRefSearchIsbn 函数及其返回的内容中,因为直到那时一切都被正确传递。我对指针的了解不多,所以我可能会遗漏一些东西,但我已经尝试了很多东西,所以我不会一一列举。我提供了主要功能和 vecRefSearchIsbn 功能,因为我认为这是问题所在,但如果有人认为问题出在其他地方,我会毫不犹豫地提供任何其他功能。
这是我在输出中得到的:
Digite um comando (t, i + isbn, q): i 9780321942050
Title:p▬┼%7☻
ISBN: 0z┼%7☻
Authors: ░É┼%7☻
Publisher: `¡┼%7☻
typedef struct {
char *title;
char isbn[MAX_ISBN];
char *authors;
char *publisher;
} Book;
typedef struct{
Book **refs;
int size;
int space;
} VecBookRef;
typedef struct{
VecBookRef *titleVec;
VecBookRef *isbnVec;
} DynCollection;
#include <stdio.h>
#include <stdlib.h>
#include "vector.h"
#include "book.h"
#include "collection.h"
#include "splitfield.h"
int main(){
char input[100];
DynCollection *col;
FILE *f=fopen("dados.csv", "r");
if(f==NULL){
printf("Erro ao abrir ficheiro");
return 0;
}
vecRefCreate();
col=collecBuild(f);
if(col==NULL){
printf("Erro ao criar coleção");
return 0;
}
fclose(f);
do{
printf("\nDigite um comando (t, i + isbn, q): ");
fgets(input, sizeof(input), stdin);
int inputLen=strlen(input);
if(inputLen==2 && input[0]=='t'){
vecRefScan(col->titleVec, NULL, printBook);
}
else if(inputLen>2 && input[0]=='i' && input[1]==' '){
char isbn[MAX_ISBN];
sscanf(input+2, "%s", isbn);
if(strlen(isbn)!=13){
printf("\nISBN invalido\n");
continue;
}
Book *b=vecRefSearchIsbn(col->isbnVec, isbn);
if(b!=NULL){
printBook(b, NULL);
}else{
printf("\nNao foi encontrado um livro com o ISBN inserido\n");
continue;
}
}
if(inputLen==2 && input[0]=='q'){
collecFree(col);
printf("Memoria limpa");
}
}while(input[0]!='q');
return 0;
}
Book *vecRefSearchIsbn(VecBookRef *vec, char *isbn){
int comparator(const void *key, const void *book){
const char *isbn=(const char *)key;
const Book *b=*(const Book **)book;
return strcmp(isbn, b->isbn);
}
Book *b=(Book*)bsearch(isbn, vec->refs, vec->size, sizeof(Book *), comparator);
if(b!=NULL){
return b;
}else return NULL;
}
void printBook(Book *b, void *context){
printf("\nTitle:%s\nISBN: %s\nAuthors: %s\nPublisher: %s\n", b->title, b->isbn, b->authors, b->publisher);
}
使用
*scanf()
: 读取字符串时始终使用最大字段宽度
char isbn[MAX_ISBN];
sscanf(input+2, "%s", isbn);
修复方法如下:
#define MAX_ISBN 13
#define str(s) str2(s)
#define str2(s) #s
typedef struct {
char *title;
char isbn[MAX_ISBN+1];
char *authors;
char *publisher;
} Book;
// ...
char isbn[MAX_ISBN+1];
sscanf(input+2, "%" str(MAX_ISBN) "s", isbn);
否则损坏是在您没有向我们展示的代码中。