Masalah dengan scanf dan string dalam loop sementara

Saya tidak mengerti apa yang salah dengan bagian kode program saya ini. Saya menggunakan lingkaran while untuk meminta pengguna memasukkan string yang akan disimpan ke string sementara (char *name) dan kemudian diteruskan sebagai argumen suatu fungsi. Namun masalahnya adalah ketika saya menggunakan fungsi scanf. Ini kodenya:

char *name;
size_t i=0;

while(i<size){
    printf("Insert #%zu item name: ",i+1);
    scanf("%s",name);
    printf("Insert #%zu item price: ",i+1);
    scanf("%u",&price);
    item=item_cons(item,name,price);
    i++;
}

person Gio    schedule 21.06.2016    source sumber
comment
However the problem is when I use scanf function apa itu?   -  person Sourav Ghosh    schedule 22.06.2016
comment
Oh maaf saya lupa memasukkannya. Oke, ini masalahnya: Saat saya memasukkan string, ia mencetak untuk (ukuran) kali masukkan 1-2-3-4-...-ukuran nama item dan masukkan 1..ukuran harga barang   -  person Gio    schedule 22.06.2016


Jawaban (2)


Dalam kode Anda

scanf("%s",name);

Anda tidak mengalokasikan memori untuk name, penunjuknya. Ini menunjuk ke lokasi memori tidak valid dan mencoba menggunakannya untuk menyimpan nilai apa pun akan memanggil tidak terdefinisi perilaku.

Anda perlu mengalokasikan memori ke name sebelum Anda dapat menggunakannya untuk menyimpan apa pun di memori yang ditunjuk olehnya. Anda juga bisa

  • buat name sebuah array, seperti char name[32] = {0}; lalu gunakan seperti scanf("%31s",name); (biasanya lebih disukai)

or,

  • mengalokasikan memori dinamis ke char *name, menggunakan malloc() atau keluarga.
person Sourav Ghosh    schedule 21.06.2016
comment
Saya menggunakan nama=malloc(sizeof(char*)*size); dan berhasil. Terima kasih! - person Gio; 22.06.2016
comment
@Gio Tidak, sepertinya Anda tidak ingin name= malloc( sizeof(*name) * size); Catatan: 1) Anda perlu memeriksa keberhasilan malloc() 2) Anda harus mengosongkan memori setelahnya. Apa masalahnya dengan arraynya? - person Sourav Ghosh; 22.06.2016
comment
Tunggu, hanya karena berhasil, bukan berarti itu benar. name=malloc(sizeof(char*)*size); salah, karena Anda ingin mengalokasikan memori untuk chars, bukan char *s... lihat komentar saya sebelumnya ^. - person Sourav Ghosh; 22.06.2016
comment
Lebih baik dikatakan name tidak memiliki inisialisasi - isinya tidak ditentukan. C tidak menentukan name poin ke lokasi memori yang tidak valid. - person chux - Reinstate Monica; 22.06.2016
comment
BTW: upaya menggunakan (dengan membatalkan referensi) untuk menyimpan nilai apa pun akan memunculkan perilaku tidak terdefinisi. benar dan agak mengherankan bahkan membaca nilai pointer adalah UB. - person chux - Reinstate Monica; 22.06.2016

coba gunakan char name[100]={'\0'} ini mengasumsikan bahwa nama besar yang akan Anda dapatkan adalah 10

person Ameer Aamar    schedule 22.06.2016
comment
Tambahkan beberapa penjelasan dengan jawaban bagaimana jawaban ini membantu OP dalam memperbaiki masalah saat ini - person ρяσѕρєя K; 22.06.2016