######使用環境
Mac
VSCode
terminal
#デバッグのやり方について質問です。
C言語をゼロから学習をしています。
基本的なことは理解し終わったので、リスト構造を使った応用問題に着手しています。
デバッグをするとき、テストケースを作って、terminalから手入力してその実行結果を確認しているのですが、この作業を効率化する方法をご存知でしたら教えていただきたいです。
イメージとしては、
terminalに下記のような順番で入力して実行させているのですが、この入力をプログラムからの返答無しで連続して入力して、結果だけ知りたい。といった感じです。
通常だと、プログラムの返答を待って入力していますが、おそらくこの仮定を省略する方法があるだろうと推測して質問しています。
例えば下記の入力ですが、コピペして入力しても通常に入力した場合と同じように動きますが、途中の処理のやり取りがうまく出力されないです。
テキストファイルを読み込ませるようなプログラムを別に書いて、それを一行ずつ読み込ませることは可能だと思いますが、そのプログラムを使用した場合、中のコードは手入力しない前提で作るしかないのでしょうか。
terminal
11 2tanaka 31 4yamada 51 6okakura 72 82 93
c
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5/* 会員情報を登録する構造体 */ 6 7struct LIST{ 8 unsigned int number; 9 char name[256]; 10 struct LIST *next; 11} ; 12 13/* 会員情報を全て表示する関数 */ 14int displayList(struct LIST *list){ 15 while(list != NULL){ 16 printf("%d:%s\n", list->number, list->name); 17 list = list->next; 18 } 19 return 0; 20} 21 22/* 会員情報を全て削除する関数 */ 23struct LIST* deleteAllList(struct LIST *list){ 24 struct LIST *tmp; 25 26 while(list != NULL){ 27 tmp = list->next; 28 free(list); 29 list = tmp; 30 } 31 32 return NULL; 33} 34 35 36/* 会員情報をリストの最後に追加し、リストの先頭アドレスを返却する関数 */ 37struct LIST* addList(struct LIST *list, char *name, unsigned int number){ 38 struct LIST *item; 39 struct LIST *top; 40 41 top = list; 42 43 item = (struct LIST*)malloc(sizeof(struct LIST)); 44 item->number = number; 45 strcpy(item->name, name); 46 item->next = NULL; 47 48 49 /* リストが空の場合は先頭に追加して終了 */ 50 if(list == NULL){ 51 list = item; 52 return list; 53 } 54 55 /* リストのnextを辿ってリストの最後を探す */ 56 /* リストの最後とは、nextがNULLの要素 */ 57 while(list->next != NULL){ 58 list = list->next; 59 } 60 list->next = item; 61 62 /* ここでreturnする場合は先頭アドレスは変わらない */ 63 return top; 64} 65 66/* 会員情報を削除し、リストの先頭アドレスを返却する関数 */ 67struct LIST* deleteList(struct LIST *list, unsigned int number){ 68 struct LIST *tmp; 69 struct LIST *top; 70 top = list; 71 72 /* 先頭ノードの場合だけ別処理 */ 73 if(list != NULL && list->number == number){ 74 tmp = list->next; 75 free(list); 76 77 /* 次の要素のアドレスをリストの先頭アドレスとして返却 */ 78 return tmp; 79 } 80 81 /* リストを辿って指定された会員番号の要素を探す */ 82 while(list != NULL){ 83 if(list->next->number == number){ 84 tmp = list->next->next; 85 free(list->next); 86 list->next = tmp; 87 return top; 88 } 89 list = list->next; 90 } 91 printf("Number %d not found!\n", number); 92 93 return top; 94} 95 96int main(void){ 97 int operation; 98 unsigned int inputnumber = 1; 99 unsigned int number = 1; 100 char inputname[256]; 101 102 struct LIST *list = NULL; 103 104 /* 会員登録情報に対する操作 */ 105 while(1){ 106 printf("operation(1:add, 2:delete, etc:exit) = "); 107 scanf("%d", &operation); 108 109 if(operation == 1){ 110 /* 1が入力されれば必要な情報を取得してリストに追加 */ 111 printf("add name = "); 112 scanf("%s", inputname); 113 114 list = addList(list, inputname, number); 115 number++; 116 } else if(operation == 2){ 117 /* 2が入力されれば必要な情報を取得してリストから削除 */ 118 if(list == NULL){ 119 printf("list is empty\n"); 120 } else { 121 printf("delete number = "); 122 scanf("%d", &inputnumber); 123 list = deleteList(list, inputnumber); 124 } 125 126 } else { 127 /* それ以外はwhileを抜ける */ 128 break; 129 } 130 131 displayList(list); 132 133 } 134 135 list = deleteAllList(list); 136 137 return 0; 138} 139
動かしているプログラム
リスト構造をC言語プログラムの実例を用いて解説 | だえうホームページ
https://daeudaeu.com/programming/c-language/list-structure/
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。