前提・実現したいこと
C言語でパソコン屋さんの注文画面を作っています。
一度書き上手くいったコードを関数に書き直していたところ、エラーになってしまいました。
Order Summaryまでは表示され、そのあとにSegmentation faultと表示されてしまいます。
よって、printf(" Selected item: %s\n", laptops[(int)select - 1].item);の部分が間違っていると解釈しています。
構造体とポインタ部分が間違っていると予想していますが、ポインタを全く理解できておらず、なにもわかりません。教えて下さい。
発生している問題・エラーメッセージ
Segmentation fault
該当のソースコード
C
1#include <stdio.h> 2#include <stdbool.h> 3#include <string.h> 4#include <math.h> 5 6typedef struct laptop { 7 char item[10]; 8 float price; 9} laptop_t; 10 11void Order(float select, float qty, laptop_t *laptops); 12void Total(); 13void FlushScanner(); 14 15void main(){ 16 Total(); 17} 18 19void Order(float select, float qty, laptop_t *laptops) { 20 printf("List of available laptops:\n"); 21 for (int i = 0; i < 6; i++) { 22 printf(" %d. %s\tRM%.2f\n", i + 1, laptops[i].item, laptops[i].price); 23 }; 24 printf("--------------------------\n"); 25 printf("Select item> "); 26 scanf("%f", &select); 27 while ((select < 1 || select > 6) || (ceil(select) != floor(select))) { 28 printf(" Error: enter again\n"); 29 printf("Select item > "); 30 scanf("%f", &select); 31 } 32 printf("Quantity > "); 33 scanf("%f", &qty); 34 while (qty < 1 || ceil(qty) != floor(qty)) { 35 printf(" Error: enter again\n"); 36 printf("Quantity > "); 37 scanf("%f", &qty); 38 } 39 printf("\n\n"); 40} 41 42void Total() { 43 laptop_t laptops[6]; 44 strcpy(laptops[0].item, "Acer"); 45 laptops[0].price = 1999.00; 46 strcpy(laptops[1].item, "HP "); 47 laptops[1].price = 2399.00; 48 strcpy(laptops[2].item, "Dell"); 49 laptops[2].price = 4999.00; 50 strcpy(laptops[3].item, "Lenovo"); 51 laptops[3].price = 3949.00; 52 strcpy(laptops[4].item, "Toshiba"); 53 laptops[4].price = 3999.00; 54 strcpy(laptops[5].item, "Sony"); 55 laptops[5].price = 7880.00; 56 57 float select, qty; 58 Order(select, qty, laptops); 59 60 float discount, subtotal, gst, total; 61 printf("Order summary\n"); 62 printf("-------------------------------\n"); 63 printf(" Selected item: %s\n", laptops[(int)select - 1].item); 64 printf(" Item price: RM%.2f\n", laptops[(int)select - 1].price); 65 subtotal = laptops[(int)select - 1].price * qty; 66 printf(" Subtotal(%.f item(s)): RM%.2f\n", qty, subtotal); 67 if (select == 4) { 68 discount = subtotal * 0.1; 69 printf(" Discount 10%%: -RM%.2f\n", discount); 70 } else if (select == 2 || select == 5) { 71 discount = 0; 72 } else { 73 discount = subtotal * 0.05; 74 printf(" Discount 5%%: -RM%.2f\n", discount); 75 } 76 gst = (subtotal - discount) * 0.08; 77 printf(" GST(8%%): RM%.2f\n", gst); 78 total = subtotal - discount + gst; 79 printf("-------------------------------\n"); 80 printf("\t\tTOTAL: RM%.2f\n", total); 81 FlushScanner(); 82} 83 84void FlushScanner() { 85 while (getchar() != '\n'); 86}
試したこと
闇雲にポインタをつけてみるばかりです。
補足情報(FW/ツールのバージョンなど)
Linux / gcc