C言語初心者です。2番の商品名検索で商品をキーボードから入力して在庫数を表示したいのだが、
C言語のスキャンフの後にどのようにすればよいのかが思い浮かばず困ってます。
そのまま答えずヒントだけをください。
###該当のソースコード #include <stdio.h> #include <string.h> #include <stdlib.h> // 未使用 #define MAXITEM 20 // stock型構造体 typedef struct { int id; // 商品ID char name[64]; // 商品名 int quantity; // 数量 } stock_t; // グローバル変数 stock_t *stock; // 後程mallocでメモリ確保 // stock_t stock[100]; int item_count; // メニュー表示 void menu(){ printf("\n"); printf("### 在庫管理システム ###\n"); printf("\n"); printf("1)商品一覧 参照\n"); printf("2)商品名で在庫数を検索\n"); printf("3)商品在庫数の増減\n"); printf("4)新商品の登録機能\\n"); printf("5)旧商品の削除機能\\n"); printf("6)商品名の編集機能\\n"); printf("\n"); // printf("7)データの保存機能\\n"); // printf("8)データの読み込み機能\\n"); // printf("\n"); printf("9)プログラム終了\n"); printf("\n"); printf("メニュー選択(1-9) > "); } // 1-numまでの数のキー入力 int read_number(int num){ int n; do { scanf("%d", &n); while(getchar() != '\n'); } while ( !(1 <= n && n <= num) ); } // キー入力待ち void hit_any_key(){ printf("\nHit any key.\n"); while(!getchar()); } // 在庫一覧表示 void show_list(){ printf("\n### 在庫一覧 ###\n"); printf("\n"); printf(" ID 商品名 数量\n"); int i; for (i = 0; i < item_count; i++){ printf("%3d %-20s %3d\n", stock[i].id, stock[i].name, stock[i].quantity); } hit_any_key(); } // 商品名検索 void search_item(){ printf("\n### 商品名検索 ###\n"); printf("\n### 商品名で在庫検索します。 ###\n"); char productname;//商品名検索用引数 char productNam;//商品在庫数 int productNamkye[] = stock.name; int product = getchar(); int prodaut1; printf("### 商品名を入力してください ###\n"); scanf("%s\n", &productname);//商品名をキーボード入力 printf("商品名 %s\n", productname); prodaut1 = strrchr(stock[i].name, product); if (product != product) { // printf("商品名 %s はありません\n", productname); }else if{ printf("商品名 %s の在庫数は %d です", productname,productNam); } hit_any_key(); } // 在庫数増減 set_quantity(){ printf("\n### 在庫数増減 ###\n"); hit_any_key(); } // 新商品登録 create_new_item(){ printf("\n### 新商品登録 ###\n"); hit_any_key(); } // 旧商品削除 destroy_old_item(){ printf("\n### 旧商品削除 ###\n"); hit_any_key(); } // 商品名編集 edit_item_name(){ printf("\n### 商品名編集 ###\n"); hit_any_key(); } // ファイルから読み込んだ文字列を返す(未使用) char *read_text_file(char const *filename){ // 変数宣言 FILE *fp = NULL; char *str = NULL; char buffer[256]; int fsize; // ファイルサイズ // 読み取りモードでファイルを開く fp = fopen(filename, "r"); if (fp == NULL){ printf("Can't read '%s'\n", filename); exit(1); } // ファイルサイズの取得 fseek(fp, 0L, SEEK_END); fsize = ftell(fp); // printf("fsize: %d\n", fsize); // メモリの動的確保 str = (char*)malloc(fsize * sizeof(char)); if (str == NULL){ printf("Can't allocate memory. 'str' is NULL.\n"); fclose(fp); exit(1); } // シーク位置を先頭に戻す fseek(fp, 0L, SEEK_SET); // テキストデータの読み込み str[0] = '\0'; while (fgets(buffer, sizeof(buffer), fp) != NULL){ strncat(str, buffer, strlen(buffer) + 1); } // ファイルクローズ fclose(fp); // 読み込んだ文字列を返す return str; } // ファイルから読み込んだレコードを、構造体に格納する // 戻り値は、レコード数 int load_data_file(char const *filename){ // 変数宣言 FILE *fp = NULL; char buffer[256]; int line_count; // 行数 // 読み取りモードでファイルを開く fp = fopen(filename, "r"); if (fp == NULL){ printf("Can't read '%s'\n", filename); exit(1); } // 行数の取得 // fseek(fp, 0L, SEEK_END); // fsize = ftell(fp); line_count = 0; while (fgets(buffer, sizeof(buffer), fp) != NULL){ line_count++; } // メモリの動的確保 stock = (stock_t*)malloc(line_count * sizeof(stock_t)); // stock_t stock[5]; if (stock == NULL){ printf("Can't allocate memory. 'stock' is NULL.\n"); fclose(fp); exit(1); } // シーク位置を先頭に戻す fseek(fp, 0L, SEEK_SET); // データの読み込み int i = 0; char *outlist[3]; while (fgets(buffer, sizeof(buffer), fp) != NULL){ // strncat(str, buffer, strlen(buffer) + 1); // 一行分bufferに読み込んだので、分離して、構造体に格納する split(buffer, ",", outlist); stock[i].id = atoi(outlist[0]); // id strcpy(stock[i].name, outlist[1]); // name stock[i].quantity = atoi(outlist[2]); // quantity i++; } // ファイルクローズ fclose(fp); // 読み込んだ行数を返す(=構造体の要素数) return i; } // 区切り文字で分離する int split(char *str, char const *delimiter, char *outlist[]){ char *token; int count = 0; token = strtok(str, delimiter); while (token != NULL && count < MAXITEM){ outlist[count++] = token; // outlist[count] = token; // count++; token = strtok(NULL, delimiter); } return count; } int main(int argc, char const *argv[]) { int i, count; // カンマ区切りサンプル char memo_str[] = "Milk, Eggs:Bread, Apple, Cheese"; char *shopping_list[MAXITEM]; // 処理前 // printf("memo_str: %s\n", memo_str); // 区切り文字で分離する count = split(memo_str, ",:", shopping_list); // 結果表示 for (i = 0; i < count; i++){ // printf("%d: %s\n", i, shopping_list[i]); } // ファイルからの文字列読み込みサンプル char *data; data = read_text_file("stock_db.txt"); // 結果表示 // printf("stock_db.txt を読み込みました\n"); // printf("%s\n", data); // malloc で確保したdataの解放 free(data); // // ##### 本番 ##### // int n; // データファイルの読み込み item_count = load_data_file("stock_db.txt"); // メニュー表示繰り返し while(1){ menu(); n = read_number(9); switch (n){ case 1: // printf("在庫一覧\n"); show_list(); break; case 2: // printf("商品名検索\n"); search_item(); break; case 3: // printf("在庫数増減\n"); set_quantity(); break; case 4: // printf("新商品登録\n"); create_new_item(); break; case 5: // printf("旧商品削除\n"); destroy_old_item(); break; case 6: // printf("商品名編集\n"); edit_item_name(); break; case 7: // printf("保存\n"); // break; case 8: // printf("読み込み\n"); // break; case 9: printf("プログラムを終了します\n"); // malloc で確保した領域の解放 free(stock); exit(1); break; } } return 0; }
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
C言語、ATOM、構造体