Why is a Printf in a Function Preventing a Variable in a Struct Array from going Corrupt in Another Function?

1
pmaed 2019-12-09 00:58.

I have got a function to read a file and attribute to a struct array multiple ints and strings, my fscanf format string looks like this: "%d.%d.%d.%d %d %60c%60c%d %8c".

And everything is OK if while I scan it and if I use a printf, but if I don't then the 2 last strings become corrupted at the end.

Since the file is gigantic and that is not the purpose of the function, I would like to take that printf out.

 typedef struct
 {
    int nacional;
    int regional;
    int distrital;
    int municipal;
  }id_geo;

  typedef struct
  {
    id_geo id_geo;
    long int cartao_cid;
    char nome_dono[61];
    char morada[61];
    int num_porta;
    char codigo_postal[9];
   }prop_id_dono;
prop_id_dono *ler_ficheiro(char *file_name, int num_linha) {
    prop_id_dono *info_geral;
    long int cartao_cid;
    char nome_ficheiro;
    char nome_dono[60];
    char morada[60];
    int num_porta;
    char codigo_postal[8]; 
    int nacional;
    int regional;
    int distrital;
    int municipal; 
    int i = 0;
    FILE *fp; 

    fp = fopen(file_name, "r");
    if (fp == NULL)
        printf("Peço desculpa, mas não foi possível abrir o ficheiro.");

    info_geral = (prop_id_dono *)malloc(sizeof(prop_id_dono) * num_linhas); 

    while (fscanf(fp, "%d.%d.%d.%d %ld %60c%60c%d %8c\n",
           &nacional, &regional, &distrital, &municipal,
           &cartao_cid, nome_dono, morada, &num_porta, codigo_postal) != EOF) {

        // Faz o scan ao ficheiro através de variáveis temporais, sendo que só 
        // depois é que atribui valores ao vetor que contém a informação geral
        info_geral[i].id_geo.nacional = nacional;
        info_geral[i].id_geo.regional = regional;
        info_geral[i].id_geo.distrital = distrital;
        info_geral[i].id_geo.municipal = municipal;
        info_geral[i].cartao_cid = cartao_cid;
        strcpy(info_geral[i].nome_dono, nome_dono + '\0');
        strcpy(info_geral[i].morada, morada + '\0');
        info_geral[i].num_porta = num_porta;
        strcpy(info_geral[i].codigo_postal, codigo_postal + '\0');

        //This is the magical printf
        printf("%d.%d.%d.%d %ld %s%s%d %s \n",
               info_geral[i].id_geo.nacional, info_geral[i].id_geo.regional,
               info_geral[i].id_geo.distrital, info_geral[i].id_geo.municipal,
               info_geral[i].cartao_cid, info_geral[i].nome_dono,
               info_geral[i].morada, info_geral[i].num_porta, 
               info_geral[i].codigo_postal);
        i++;    
    }
    fclose(fp);
    return info_geral;
}

The input is something like this, but it repeats 20,000 something times in the file 1.1.1.1 1234568 Name, 60 caracters in total(including the spaces)Adress(same thing with the spaces here)House Number Postal Code

1 answers

1
chqrlie 2019-12-09 01:23.

You parse input fragments with %60c into character arrays of size 60.

Assuming the conversion succeeds, these arrays will not contain proper C strings, and your attempt at concatenating a '\0' does not work in C.

Here are ways to improve your program:

  • you should read lines into a local array for easier error reporting in case of conversion failures, and use sscanf() fo parsing.
  • you should make the destination arrays one byte longer and set a null terminator at the end. The arrays in the prop_id_dono structure should be made large enough too.
  • you should check the return value of sscanf and report conversion failures
  • you should stop scanning after num_linhas lines.
  • you should check for memory allocation failure.

Here is a corrected version:

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

typedef struct {
    int nacional;
    int regional;
    int distrital;
    int municipal;
} id_geo;

typedef struct {
    id_geo id_geo;
    long int cartao_cid;
    char nome_dono[61];
    char morada[61];
    int num_porta;
    char codigo_postal[9];
} prop_id_dono;

prop_id_dono *ler_ficheiro(const char *file_name, int num_linha) {
    char buf[256];
    prop_id_dono *info_geral;
    long int cartao_cid;
    char nome_ficheiro;
    char nome_dono[61];
    char morada[61];
    int num_porta;
    char codigo_postal[9]; 
    int nacional;
    int regional;
    int distrital;
    int municipal; 
    int i = 0;
    FILE *fp; 

    fp = fopen(file_name, "r");
    if (fp == NULL) {
        printf("Peço desculpa, mas não foi possível abrir o ficheiro.");
        return NULL;
    }
    // use calloc to allocate an array initialized to all bits zero
    info_geral = (prop_id_dono *)calloc(num_linhas, sizeof(prop_id_dono));
    if (info_geral == NULL) {
        fclose(fp);
        return NULL;
    }

    while (i < num_linhas && fgets(buf, sizeof buf, fp) != NULL) {
        // Faz o scan ao ficheiro através de variáveis temporais, sendo que só 
        // depois é que atribui valores ao vetor que contém a informação geral
        if (sscanf(buf, "%d.%d.%d.%d %ld %60c%60c%d %8c",
                   &nacional, &regional, &distrital, &municipal,
                   &cartao_cid, nome_dono, morada, &num_porta, codigo_postal) != 9) {
            printf("parsing error: %s", buf);
            continue;
        }
        info_geral[i].id_geo.nacional = nacional;
        info_geral[i].id_geo.regional = regional;
        info_geral[i].id_geo.distrital = distrital;
        info_geral[i].id_geo.municipal = municipal;
        info_geral[i].cartao_cid = cartao_cid;
        nome_dono[60] = '\0';
        strcpy(info_geral[i].nome_dono, nome_dono);
        morada[60] = '\0';
        strcpy(info_geral[i].morada, morada);
        info_geral[i].num_porta = num_porta;
        codigo_postal[8] = '\0';
        strcpy(info_geral[i].codigo_postal, codigo_postal);
        i++;    
    }
    fclose(fp);
    // note that the caller does not receive the number of lines parsed.
    // passing the address of a int for this purpose if a good solution.
    return info_geral;
}

MORE COOL STUFF

Jana Duggar: Semua yang Dia Katakan Tentang Cinta dan Jendela 5 Tahunnya untuk Menemukan 'Yang Satu'

Jana Duggar: Semua yang Dia Katakan Tentang Cinta dan Jendela 5 Tahunnya untuk Menemukan 'Yang Satu'

Jana Duggar terbuka tentang pencarian cintanya. Inilah semua yang dia katakan tentang topik dan jendela lima tahun untuk menikah.

Sam Heughan Tahu Persis Apa yang Akan Dia Ambil Dari Set 'Outlander' - 'Saya Merasa Seperti Saya Jamie Ketika Saya Memakainya'

Sam Heughan Tahu Persis Apa yang Akan Dia Ambil Dari Set 'Outlander' - 'Saya Merasa Seperti Saya Jamie Ketika Saya Memakainya'

Bintang 'Outlander' Sam Heughan baru-baru ini mengungkapkan apa yang akan dia ambil dari lokasi syuting untuk mengingat Jamie Fraser, peran yang membuatnya menjadi bintang.

Lagu The Early Beatles yang Menjadi Salah Satu 'Penampilan Paling Menyenangkan' Band, Menurut Fab Four Insider

Lagu The Early Beatles yang Menjadi Salah Satu 'Penampilan Paling Menyenangkan' Band, Menurut Fab Four Insider

'She Loves You' ditulis dalam satu jam, direkam dalam sehari, dan merupakan lagu The Beatles dengan salah satu penampilan terbaik dalam karir mereka.

Dolly Parton Membantu Neneknya yang 'Cacat' Ketika Tidak Ada Cucu Lain yang Mau—Dia Juga Mengerjainya

Dolly Parton Membantu Neneknya yang 'Cacat' Ketika Tidak Ada Cucu Lain yang Mau—Dia Juga Mengerjainya

Dolly Parton dan Nenek Bessie memiliki hubungan khusus. Nenek Parton sakit parah, tapi itu tidak menghentikan Dolly untuk mengerjainya.

Apa Kayu Terkeras di Dunia?

Apa Kayu Terkeras di Dunia?

Anda mungkin mengira kayu ek atau hickory kuat, tetapi jika berbicara tentang kayu terkeras di dunia, keduanya tidak ada yang mendekati.

10 Makhluk Laut Paling Menakutkan yang Mengintai di Kedalaman Laut

10 Makhluk Laut Paling Menakutkan yang Mengintai di Kedalaman Laut

Lautan memang penuh keindahan, tetapi juga menyembunyikan beberapa makhluk laut paling menakutkan di planet ini. Banyak dari hewan ini bersembunyi jauh di bawah permukaan laut, di dunia laut dalam yang gelap dan bertekanan tinggi.

10 Pesona Pedang Terbaik di Minecraft

10 Pesona Pedang Terbaik di Minecraft

Jika Anda sedang melawan monster musuh atau bersiap untuk skenario PvP, mengetahui pesona pedang terbaik di Minecraft dapat memberi Anda keuntungan besar. Memikat pedang memungkinkan Anda menghasilkan lebih banyak kerusakan, meningkatkan jumlah monster yang dijatuhkan, dan memperpanjang daya tahan pedang Anda.

13 Negara Sosialis yang Terlihat Sangat Berbeda Satu Sama Lain

13 Negara Sosialis yang Terlihat Sangat Berbeda Satu Sama Lain

Ketika orang berbicara tentang negara sosialis, mereka sering membayangkan kendali penuh pemerintah dan tanpa kepemilikan swasta. Namun dalam praktiknya, ekonomi sosialis sangat bervariasi.

Rekap The Bear: Apakah Marcus pria yang paling baik hati, paling lembut, dan paling tulus di Chicago?

Rekap The Bear: Apakah Marcus pria yang paling baik hati, paling lembut, dan paling tulus di Chicago?

“Children” merilis cameo dengan nama besar dan beberapa berita buruk

Dengan Harga $9.800, Maukah Anda 'Mengemasnya' di Toyota RAV4 2008 Tujuh Tempat Duduk Ini?

Dengan Harga $9.800, Maukah Anda 'Mengemasnya' di Toyota RAV4 2008 Tujuh Tempat Duduk Ini?

RAV4 ini diklaim dalam kondisi sangat baik dan siap digunakan untuk permainan kursi musik.

Van Pengiriman Amazon Menyala dalam Ledakan Berapi-api Selama Musim Panas di Houston

Van Pengiriman Amazon Menyala dalam Ledakan Berapi-api Selama Musim Panas di Houston

Rekaman drone memperlihatkan petugas pemadam kebakaran yang tampak kesulitan memadamkan api.

Pertunjukan Black Panther Marvel Akan Menjadi Pertunjukan Animasi Paling Penting

Pertunjukan Black Panther Marvel Akan Menjadi Pertunjukan Animasi Paling Penting

Eyes of Wakanda terhubung langsung dengan MCU, ditambah pembaruan tentang X-Men '97, What If..., Daredevil, dan banyak lagi.

Anna Wintour Mundur sebagai Pemimpin Redaksi Vogue Setelah 37 Tahun — dan Dia Sedang Membuka Lowongan Kerja!

Anna Wintour Mundur sebagai Pemimpin Redaksi Vogue Setelah 37 Tahun — dan Dia Sedang Membuka Lowongan Kerja!

Pemimpin redaksi lama, yang bergabung dengan American Vogue pada tahun 1988, mengumumkan berita tersebut dalam rapat staf pada Kamis pagi, 26 Juni.

Pemeran Laguna Beach: Di Mana Mereka Sekarang?

Pemeran Laguna Beach: Di Mana Mereka Sekarang?

'Laguna Beach' mengikuti kehidupan siswa sekolah menengah Lauren Conrad, Kristin Cavallari, Stephen Colletti, dan banyak lagi pada pertengahan tahun 2000-an. Berikut ini adalah tempat tinggal para pemeran serial realitas MTV tersebut sekarang.

Riwayat Kencan Ava Gardner: Melihat Kembali Pernikahan dan Kisah Asmara Sang Ikon Hollywood

Riwayat Kencan Ava Gardner: Melihat Kembali Pernikahan dan Kisah Asmara Sang Ikon Hollywood

Ava Gardner pernah menikah dengan Mickey Rooney dan Frank Sintra, dan ia pernah berpacaran dengan beberapa bintang Hollywood lainnya. Berikut ini kilas balik riwayat berpacaran Ava Gardner.

Siapakah Istri John Cleese? Semua Tentang Jennifer Wade

Siapakah Istri John Cleese? Semua Tentang Jennifer Wade

John Cleese menikahi istrinya, Jennifer Wade, pada tahun 2012. Berikut semua yang perlu Anda ketahui tentang istri John Cleese, Jennifer Wade.

kata ganti itu sangat menakutkan

Itu mengejutkan saya Tiba-tiba seperti yang sering terjadi Ini di tengah jalan lagi <Tidak, bukan yang di pasifik Anda merah marun, yang di karnaval> Setiap berita utama keras…..

3 Cara Terbukti untuk Meningkatkan Keterampilan Menulis Anda

Manfaat menulis, dan strategi untuk membantu Anda melakukannya

3 Cara Terbukti untuk Meningkatkan Keterampilan Menulis Anda

Di tahun 2022, dengan dirilisnya GPT-3, kemampuan menulis sepertinya menjadi kurang penting. Dengan AI, orang dengan tulisan yang buruk juga dapat menghasilkan staf yang berkualitas.

Erosi Lambat: Mengungkap Cara Orang Menghilang dalam Kariernya

Erosi Lambat: Mengungkap Cara Orang Menghilang dalam Kariernya

Di dunia yang serba cepat dan kompetitif saat ini, karier seseorang memainkan peran penting dalam pertumbuhan pribadi, stabilitas keuangan, dan kepuasan hidup secara keseluruhan. Namun, banyak orang menemukan diri mereka terjebak dalam siklus stagnasi dan ketidakpuasan tanpa henti, secara bertahap menyia-nyiakan kehidupan profesional mereka.

Apa yang membuat podcast berpengaruh?

Apa yang membuat podcast berpengaruh?

Minggu lalu saya melihat siaran pers, dikirim melalui PressGazette (situs web berita media Inggris). Artikel tersebut mengumumkan bahwa Acast, perusahaan hosting dan periklanan podcast Scandi, akan memimpin konsorsium penerbit "mungkin yang paling berpengaruh" dalam podcasting.

Language