输出中出现奇怪的字符

问题描述 投票:0回答:1

我有这个程序可以从文件中提取书籍数据(书名、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);
}

c memory-management
1个回答
0
投票

使用

*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);

否则损坏是在您没有向我们展示的代码中。

© www.soinside.com 2019 - 2024. All rights reserved.