ошибка сегментации в массиве c - PullRequest
0 голосов
/ 01 мая 2018

Я довольно новичок в программировании, и это задание колледжа. Я не знаю, что является причиной этой ошибки сегментации, пожалуйста, помогите.

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

main() {
    int i, n;

    struct obat {
        char nama[10];
        char kode[10];
        int harga[10];
        int stok[10];
    };

    struct obat o;

    printf("Masukan jumlah obat = ");

    scanf("%d", &n);

    for (i = 0; i < n; i++) {
        printf("Masukan nama obat ke-%d", i + 1);
        scanf("%s", &o.nama[i]);
    }

    for (i = 0; i < n; i++) {
        printf("Nama obat ke-%d = %s", i + 1, o.nama[i]);
    }
}

1 Ответ

0 голосов
/ 01 мая 2018

scanf ("% s", & o.nama [i]);

если nama является массивом символов, вы хотите указать спецификатор формата% c вместо% s. % s для строки, которая будет пытаться записать всю входную строку (до нулевого терминатора) в ваш массив символов.

Итак, если бы вы вводили «This Will Segfault», вы бы это сделали (даже из вашего первого цикла в цикле for)

o.nama[0] = T
o.nama[1] = h
o.nama[2] = i
o.nama[3] = s
o.nama[4] = "space" (not the word but the symbol)
o.nama[5] = W
o.nama[6] = i
o.nama[7] = l
o.nama[8] = l
o.nama[9] = "space" (again)
o.nama[10] = S //This is the seg fault most likely, although it may also write into other parts of your struct unintentionally.

если вам нужен массив строк вместо массива символов, вам нужно изменить структуру на что-то вроде этого:

main() {
    int i, n;

    struct obat {
        char nama[10][512]; //the 512 here should be #defined
        char kode[10];
        int harga[10];
        int stok[10];
    };

    struct obat o;
    memset(o, 0, sizeof(stuct obat)); //set your struct to 0 values, important for strings.

    printf("Masukan jumlah obat = ");

    scanf("%d", &n);

    for (i = 0; i < n; i++) { //loops over at most 10 inputs and reads the input string
        printf("Masukan nama obat ke-%d", i + 1);
        scanf("%s", &o.nama[i][0]);
    }

    for (i = 0; i < n; i++) {
        printf("Nama obat ke-%d = %s", i + 1, o.nama[i][0]);
    }
}
...