ปัญหาเกี่ยวกับ scanf และ strings ใน while loop

ฉันไม่เข้าใจว่าเกิดอะไรขึ้นกับโค้ดส่วนนี้ของโปรแกรมของฉัน ฉันใช้ while cicle เพื่อขอให้ผู้ใช้แทรกสตริงที่จะถูกบันทึกลงในสตริงชั่วคราว (char *name) แล้วส่งผ่านเป็นอาร์กิวเมนต์ของฟังก์ชัน อย่างไรก็ตาม ปัญหาคือเมื่อฉันใช้ฟังก์ชัน scanf นี่คือรหัส:

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 แหล่งที่มา
comment
However the problem is when I use scanf functionมันคืออะไร?   -  person Sourav Ghosh    schedule 22.06.2016
comment
อ่อ ขอโทษครับลืมใส่ ตกลง นี่คือปัญหา: เมื่อฉันใส่สตริง มันจะพิมพ์เป็น (ขนาด) ครั้ง ใส่ 1-2-3-4-...-ชื่อรายการขนาด และแทรก 1..ขนาดรายการราคา   -  person Gio    schedule 22.06.2016


คำตอบ (2)


ในรหัสของคุณ

scanf("%s",name);

คุณไม่ได้จัดสรรหน่วยความจำสำหรับ name ซึ่งเป็นตัวชี้ มันชี้ไปที่ตำแหน่งหน่วยความจำ ไม่ถูกต้อง และความพยายามที่จะใช้มันเพื่อจัดเก็บค่าใดๆ จะเรียกใช้ undef พฤติกรรม

คุณต้องจัดสรรหน่วยความจำให้กับ name ก่อนจึงจะสามารถใช้เพื่อจัดเก็บสิ่งใด ๆ ในหน่วยความจำที่มันชี้ไป คุณก็ทำได้เช่นกัน

  • สร้าง name อาร์เรย์ เช่น char name[32] = {0}; จากนั้นใช้เช่น scanf("%31s",name); (มักจะต้องการ)

or,

  • จัดสรรหน่วยความจำแบบไดนามิกให้กับ char *name โดยใช้ malloc() หรือตระกูล
person Sourav Ghosh    schedule 21.06.2016
comment
ฉันใช้ name=malloc(sizeof(char*)*size); และมันใช้งานได้ ขอบคุณ! - person Gio; 22.06.2016
comment
@Gio ไม่ มันดูไม่เหมือน แต่คุณอาจต้องการ name= malloc( sizeof(*name) * size); หมายเหตุ: 1) คุณต้องตรวจสอบความสำเร็จของ malloc() 2) คุณต้องเพิ่มหน่วยความจำในภายหลัง อาร์เรย์มีปัญหาอะไร? - person Sourav Ghosh; 22.06.2016
comment
เดี๋ยวก่อน เพียงเพราะ ใช้งานได้ ไม่ได้หมายความว่าถูกต้อง name=malloc(sizeof(char*)*size); ผิด เนื่องจากคุณต้องการจัดสรรหน่วยความจำสำหรับ chars ไม่ใช่ char *s... ดูความคิดเห็นก่อนหน้าของฉัน ^. - person Sourav Ghosh; 22.06.2016
comment
ดีกว่าที่จะบอกว่า name ขาดการกำหนดค่าเริ่มต้น - ไม่ได้ระบุเนื้อหา C ไม่ได้ระบุจุด name ไปยังตำแหน่งหน่วยความจำที่ไม่ถูกต้อง - person chux - Reinstate Monica; 22.06.2016
comment
BTW: ความพยายามใช้ (โดยการยกเลิกการอ้างอิง) เพื่อจัดเก็บค่าใด ๆ จะทำให้เกิดพฤติกรรมที่ไม่ได้กำหนด เป็นจริงและค่อนข้างน่าประหลาดใจแม้แต่การอ่านค่า ตัวชี้ ก็คือ UB - person chux - Reinstate Monica; 22.06.2016

ลองใช้ชื่อถ่าน[100]={'\0'} โดยถือว่าชื่อที่ใหญ่กว่าที่คุณจะได้รับคือ 10

person Ameer Aamar    schedule 22.06.2016
comment
เพิ่มคำอธิบายพร้อมคำตอบว่าคำตอบนี้ช่วย OP ในการแก้ไขปัญหาปัจจุบันได้อย่างไร - person ρяσѕρєя K; 22.06.2016