質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

Q&A

解決済

2回答

1095閲覧

C言語でデバッグする方法を知りたい。terminalからの入力を省く方法。

Kchan_01

総合スコア110

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

0グッド

0クリップ

投稿2020/03/02 03:42

######使用環境
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/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

C言語に限りませんが、通常プログラムの入力は「標準入力」から受け取り、出力は「標準出力」に出力する、ようになっています。

わざわざ「標準」と付けているのは、これが入出力のフォーマットに則っている限り、「どこから入れようがどこに出そうが」同じプログラムでいいようになっているからです。

つまり、標準入力を「ファイルから読み込ませる」ことができるようになっているのです。

テキストファイルを読み込ませるようなプログラムを別に書いて、それを一行ずつ読み込ませることは可能

プログラムを書くまでもなく、OS の機能としてそのような機能が備わっています。
「標準入力」「リダイレクト」といった単語を元に調べてみましょう。

投稿2020/03/02 03:58

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

テキストファイルを読み込ませるようなプログラムを別に書いて (後略)

リダイレクトによるものは回答されましたので, プログラムを修正する方向を考えます.

まず, データをファイルに保存しておく機能を追加するのは如何でしょうか.
起動時にファイルを読み込み, 終了時にファイルに上書き保存することで, 実際のシステムに近い継続性ができますし, 結果を(ファイルを見ることで)確認し易くなります.
その上で, 現在対話によって行っている追加・削除の機能を, 起動パラメータによって行えるようにします.

例えばこのプログラムが sample という名前としましょう.
起動パラメータを指定しなかった場合は, 現在のように対話形式で操作できるようにします.

plain

1% sample 2operation(1:add, 2:delete, etc:exit) = 3 (略) 4%

一方, パラメータを指定した場合は対話せず,

plain

1% sample 1 tanaka 2%

"1" により "tanaka" をリストに追加という動作をさせ,

plain

1% sample 2 1 2%

とした場合も, "2" により "1" 番のデータをリストから削除という動作をさせます.

また, 削除の際にエラーとして "list is empty" を表示しているような場合は, main 関数の戻り値を 1 以上とすることで, バッチ処理時にエラーを判定することが出来るようになります.

処理結果のファイルの中身が操作通りかはまた別の方法で確認することになりますが, 動作させる点につきましては, 対話形式よりは簡単になるのではないでしょうか.

投稿2020/03/02 06:49

jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問