単体テストの方法がわからない

このQ&Aのポイント
  • 表示開始行から終了行までの内容を表示させるSub関数の単体テスト方法について教えてください
  • iとisttlineとiendlineに適当な数を入れて疑似mainにprint文で表示させる方法を教えてください
  • Sub_disp関数を使って開始行から終了行までの内容を表示する方法を教えてください
回答を見る
  • ベストアンサー

単体テストの方法が分からない・・。

表示開始行から終了行までの内容を表示させるSub関数です。iは行カウンタ、sttは先頭エリアポインタ、isttlineは表示開始行、iendlineは表示終了行です。 開始行から終了行まで内容を表示できるか確認したいです。 iとisttlineとiendlineに適当な数を入れて疑似mainにprint文で表示?させればよいのでしょうか・・? どう書けばよいのかいまいち分かりません。 どなたか教えてください。 #include<stdio.h> int Sub_disp(LINE *stt_pnt,int isttline, int iendline) { int i=1; while(i!=isttline){ stt_pnt=stt_pnt->next; } while(i!=iendline){ printf("%d:" "%s", i, stt_pnt->buf); i++; stt_pnt=stt_pnt->next; } return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

たとえば: printf改めfprintfでファイルに書き出します。 あらかじめ期待される結果を別のファイルで用意しておき、 両者が一致すればよし。 ※ 目視チェックなら今のままでもかまわんですが。 テストケースとしては適当な数のデータをLISTに 詰め込んでおいてisttline, iendline のいくつかの 組み合わせについてやればいいでしょう。 - データ数0のときちゃんと動くか? - isttline, iendline が 0 以下の時は? - isttline == iendline の時は? - isttline > iendline の時は? などなど、アナがいっぱい空いてますね ^^;

関連するQ&A

  • コマンド分岐処理 単体テスト

    C言語勉強中です。Sub関数の単体テストを行いたいのですが、どうすれば良いのか分かりません。疑似mainを作ってそこに実行された関数の戻り値を返す?というのはなんとなく分かります・・。どういう風に書けばよいのか良いのですか?? #include<stdio.h> int sub_command(int icmd,LINE **stt_pnt,LINE **cur_pnt,LINE **help_pnt,char *afname) { static char *adress=NULL; static int iupdate=0; int ret; int pret; switch(icmd){ case 1: *cur_pnt=(*cur_pnt)->next; Sub_current(*stt_pnt,*cur_pnt); } break; case 2: Sub_apend(stt_pnt,cur_pnt); iupdate==1; break; case 3: Sub_delete(stt_pnt,cur_pnt); iupdate==1; Sub_current; break; case 4: Sub_past(cur_pnt,adress); iupdate==1; break; case 5: ret=Sub_save(*stt_pnt,iupdate,afname); if(ret==0){ iupdate==0; } break; case 6: adress=Sub_copy(*cur_pnt,adress); break; case 7: Sub_help(help_pnt); break; case -1: pret=Sub_quit(iupdate); break; } return pret; }

  • またまたテストの復習なんですが・・・

    処理内容 基数、および変換対象数値(10進数)を入力させ、それに応じた基数変換を行う。その結果を画面に出力する。 ソースプログラム #include<stdio.h> #define MAX_OUT (16) int InputNum(int, int); char ChangeNum(int); /* メイン処理 */ main(){ int i; /* カウンタ */ int num; /* 対象数値 */ int num_base /* 基数 */ int num_next, num_out; char str[MAX_OUT]; /* 変換後文字格納用 */ while (1){ printf("基数を入力してください(2~32)\n"); printf("(2~32以外の入力で終了)\n"); num_base=InputNum(2,32); if (-1==num_base) { break; } printf("対象の数値を入力してください(0~65535)\n"); printf("(0~65535以外の入力で終了)\n"); num=InputNum(0,65535); if (-1==num) { break; } /* 変換開始 */ ( 1 ) for (i=0; i<MAX_OUT; i++){ /* 変換終了か判定する */ if (num_base>num_next){ /* 変換後文字の格納 */ str[i++]=ChangeNum(num_next); break; } /* 数値文字を抽出 */ num_out=( 2 ) str[i]=ChangeNum(num_out); /* 次の行へ */ num_next=( 3 ) } /* 変換結果を出力 */ printf("対象数値%dの%d進数表現は\n",num, num_base); for (i -= 1; 0<=i; i--) { printf("%c", str[i]); } printf("\nです\n"); } printf("終了します\n"); } /* 数値入力処理 */ int InputNum(int min, int max){ int ret; scanf("%d", &ret); if ((min>ret) || (max<ret)){ ret=-1; } return ret; } /* 数値を文字に変換 */ char ChargeNum(int num){ char ret=0; if (10>num){ ret=num+'0'; } else{ ret=( 4 )+'A'; } return ret; } という問題なんですが、(1)~(4)の答えと説明をどなたかして頂けないでしょうか?どうぞよろしくお願いします!ちなみにwhile(1)は無限ループです。

  • 配列のコピー

    配列bufの内容をstrにコピーしてgetsを使い 表示させたいのですが、うまくいかず 余計な文字まで出力されます、どのようにすれば うまくいくでしょうか? どなたかアドバイスよろしくお願いしますm(_ _)m #include <stdio.h> void main(){ char buf[256]="message"; char str[256]; int i = 0; while(buf[i] != NULL){ str[i] = buf[i]; i++; } printf(str); }

  • 動かないです

    おかしなところが有ったらアドバイス・修正等お願いします。 うしろ3行を表示させたいです。 0~2行の場合はその分だけ表示させたいです。 # include <stdio.h> # include <stdlib.h> # include <string.h> char *getline(void) { char *buf = NULL; int size = 0; int oldsize; do { oldsize = size; size = size * 2 + 80; buf = realloc(buf, size + 1); if(!buf) { fprintf(stderr, "memory allocation failed\n"); exit(1); } if(!fgets(buf + oldsize, size + 1 - oldsize, stdin)) if(oldsize) break; else { free(buf); return NULL; } }while(strlen(buf + oldsize) == size - oldsize); return buf; } void scan(char **lines, int n_lines) { char *p; int i; for(i = 0; i < n_lines; i++) lines[i] = NULL; while(p = getline()) { free(lines[0]); for(i = 0; i < n_lines - 1; i++) lines[i] = lines[i+1]; lines[n_lines - 1] = p; } } void print(char **lines, int n_lines) { int i; for(i = 0; i < n_lines; i++) if(lines[i]) fputs(lines[i], stdout); } int main(void) { char *lines[3]; int i; scan(lines, 3); print(lines, 3); for(i = 0; i < 3; i++) free(lines[i]); return 0; }

  • ファイルの内容の表示

    実行時のコマンドライン引数で指定したファイルの内容を、行番号付きで画面に表示するプログラムを作る という問題です。ヒントも与えられています。 行番号付きの表示、コマンドライン引数の利用。両者を組み合わせればできるはずだ >  main関数の引数にargcとargvを指定して、コマンドライン引数をファイル名として利用する。キーボード入力を促す文(プロンプト)や改行チェックは不要なので書かないこと >  コマンドライン引数が指定されない場合は、メッセージを表示してプログラムを終了 >  ファイルの内容を画面表示する処理は、ユーザー定義関数put_file_contentsに記述する。仮引数には文字型のポインタ変数をひとつ指定し、ファイル名を受け渡せるようにする。put_file_contents自体の型は整数型(int)で、正常終了なら返り値0を返すこと。 行番号付きのプログラム#include<stdio.h> > int put_file(char *filename); > > int main() > { > char line[50]; > char *ptr; > > printf("ファイル名を入力:"); > fgets(line,sizeof(line),stdin); > ptr = line + strlen(line) - 1; > if(*ptr == '\n') { > *ptr = '\0'; > } > > put_file(line); > > return 0; > } > > int put_file(char *filename) > { > FILE *fp; > char buf[100]; > int line_no; > > fp = fopen(filename,"r"); > if (fp == NULL){ > printf("%sを開けません\n",filename); > return 1; > } > line_no = 1; > while (fgets(buf,sizeof(buf),fp) != NULL){ > printf("%3d: ",line_no); > printf("%s",buf); > line_no++; > } > fclose(fp); > > return 0; > } で、コマンドライン引数のプログラムは#include<stdio.h> void write_key_inputs(char *filiname); int main(int argc, char *argv[1]) { write_key_inputs(argv[1]); return 0; } void write_key_inputs(char *filename) { FILE *fp; char buf[100] ; fp = fopen(filename,"w"); while(fgets(buf, sizeof(buf),stdin) != NULL) { fputs(buf, fp); } fclose(fp); return ; } です。これらを組み合わせて少しいじると出来るみたいなのですが、できていません。ちなみに私が考えたプログラムは #include<stdio.h> int put_file_contents(char *filename); int main(int argc,char *argv[]) { int i; if(argc == 1){ printf("コマンドライン引数がありません\n"); return 1; } for(i = 0;i<argc;i++) printf("argv[%d]は「%s」です\n",i,argv[i]); put_file(i); return 0; } int put_file(char *filename) { FILE *fp; char buf[100]; int line_no; fp = fopen(filename,"r"); line_no = 1; while (fgets(buf,sizeof(buf),fp) != NULL){ printf("%3d: ",line_no); printf("%s",buf); line_no++; } fclose(fp); return 0; } です。コマンドライン引数は表示されるのですが、行番号が表示されません。どうしたらいいでしょうか??

  • C言語の問題がわからないです。

    C言語のプログラムで、列数を自分で決めて、 (例)3列         ●(この行を最後として)   □● ●□● 上記のプログラムを作りたいのですが、 上手くいきません。途中まで作ったのですが、なかなか思うようにいかないです。どうすれば上記のようになりますでしょうか? #include <stdio.h> void disp(int x, int y); main() { int i,n; printf("表示する列:"); scanf("%d",&n); disp(3,3); for(i=1;i<=n;i++){ if(i%2==0){ disp(n-i,4); disp(i,2); } else{ disp(n-i,4); disp(i,1); } disp(1,3); } } void disp(int x, int y) { int i; for(i=0;i<x;i++){ if(y==1){ printf("●"); } else if(y==2){ printf("□"); } else if(y==3){ printf("\n"); } else{ printf("\0"); } } }

  • ポインタを使った連結リストへの挿入

    siteiで指定されているポインタの直後に要素xを挿入する関数insertをポインタの連結リストを用いて作成したのですが、実行するとセグメンテーション違反がでて上手く動きません。何処に問題があるのでしょうか?topの初期値が不定になるのが問題と思い、topをNULLで初期化して実行してみたのですが、結果は変わりませんでした。 宜しければ回答または問題点を指摘していただけますでしょうか?宜しくお願いします。 typedef struct{ int data; struct DATA *next; }DATA; DATA top; int insert(int x,DATA *sitei) { DATA *p,*buf; p=&top; while( p!=NULL && p!=sitei) p=p->next; buf=malloc(sizeof(DATA)); buf->next=p->next; p->next=buf; buf2->data=x; return 0; }

  • 2つ質問があり、まず1つ目なのですが・・

    次のプログラム1行ずつみていったところ、何をしているか分からないところがけっこうありまして。。。 まだPerl初心者で困惑しております(><)以下の文でコメントがないところ分かりません。 コメントあるところも怪しいかもしれません。 for($i=1; $i<80; $i++) { printf("a2006%03d",$i); #a20061から200680まで 出力。  for($k=0; $k<20; $k++) { #0から20までの間のとき{}内を実行。 $pnt=int(rand(100)); #100までの乱数pntを定義する。 print ",";      #,を出力。 if( $pnt >=20 ) {#pntが20以上ならpntを出力。 print $pnt; } } print "\n"; #改行を出力。 } while( $a = <> ) { $a =~ s/\n$//; #改行と/をaと定義する。 @b = $a =~ /^([^,]*)(,*.*)$/; # $name = $b[0]; $seq =0; $isum = 0; $icnt =0; while( $b[1] ne "" ) { @b = $b[1] =~ /^,([^,]*)(,*.*)$/; if( $b[0] ne "" ) { $isum += $b[0]; $sum[$seq] += $b[0]; $icnt++; intの数をカウントしていく。 $cnt[$seq]++; } $seq++; seqの数をカウントしていく。 } printf("%s:%.2f\n", $name, $isum/$icnt); }   #文字列$nameと$isum/$icntを出力。 for($i=0; $i<=$#sum; $i++) { #iが0sum以下のとき                {}内を実行 printf(" %.2f", $sum[$i]/$cnt[$i]); } print "\n"; #改行

    • ベストアンサー
    • Perl
  • javaのコンパイルができません。

    コンパイルができません エラーの内容とソースコードは次です Microsoft Windows [Version 6.0.6002] Copyright (c) 2006 Microsoft Corporation. All rights reserved. C:\Users\j1409061\Documents\java\MeikaiJava>javac SR091409061.java SR091409061.java:7: 式の開始が不正です。 const int MAX_INT = 2147483647; ^ SR091409061.java:8: 式の開始が不正です。 const int BUFFER_SIZE = 100; ^ SR091409061.java:9: ';' がありません。 int main();{ ^ SR091409061.java:16: ']' がありません。 char buf[BUFFER_SIZE]; ^ SR091409061.java:16: 式の開始が不正です。 char buf[BUFFER_SIZE]; ^ SR091409061.java:22: 式の開始が不正です。 n = sscanf(buf, "%d %c", &data, &c); ^ SR091409061.java:22: 式の開始が不正です。 n = sscanf(buf, "%d %c", &data, &c); ^ SR091409061.java:73: 式の開始が不正です。 n = sscanf(buf+i, "%d", &data); ^ SR091409061.java:96: class、interface、または enum がありません。 } ^ エラー 9 個 C:\Users\j1409061\Documents\java\MeikaiJava> //最大値と最小値を求めよう // C:\Users\j1409061\Documents\java\MeikaiJava\SR091409061.java class SR091409061 { public static void main(String args[]) { Scanner stdIn = new Scanner(System.in); const int MAX_INT = 2147483647; const int BUFFER_SIZE = 100; int main();{ /* 変数を定義、初期化 */ int data; int max = -1; int min = MAX_INT; bool data_exist = false; int i, n; char buf[BUFFER_SIZE]; printf("Please input data : "); while(true) { /* データ(1行分読み込み) */ fgets(buf, BUFFER_SIZE, stdin); /* データ取り出しと計算 */ n = sscanf(buf, "%d %c", &data, &c); if( ( n == -1 ) || ( n == 0 ) ) { break; } else if (n == 1) { // the number of data is 1. data_exist = true; data = abs( data ); if(max < data){ /* maxを変更 */ max = data; } if(min > data){ /* minを変更 */ min = data; } } else if (n == 2) { // the number of data is larger than 2. i = 0; while (true) { data_exist = true; data = abs( data ); if(max < data){ /* maxを変更 */ max = data; } if(min > data){ /* minを変更 */ min = data; } // 空白文字を読み飛ばす while (true) { if(buf[i] == ' ') { i++; } else { break; } } // 数字(0から9)を読み飛ばす while (true) { if( ( buf[i] >= '0' ) && ( buf[i] <= '9' ) ) { i++; } else { break; } } // 行末なら終える if(buf[i] == '\n') { break; } // データ読み込み.読み込みに成功したら次の文字へ(i++), 失敗したら終える(break). n = sscanf(buf+i, "%d", &data); if(n == 0) { break; } i++; } } if(n == 0) { break; } } /* 最大値, 最小値を出力 */ if (!data_exist) { printf("No data.\n"); } else { printf("Max = %d\n",max); printf("Min = %d\n",min); } return 0; } } } } よろしくお願いします

  • パケットデータを取得したいです。

    現在Cでコーティング中です。環境はWindowsのVisualstadioとなります。 winpcapを使用しているのですが、pcap_next_ex()の詳しい使い方がよくわかりません。 http://codezine.jp/article/detail/126?p=2 このようなサイトを見つけたのですが、pkt_dataにデータが保存されているようです。 これをファイルにひたすら出力を行いたいと思っています。 おそらくデータのコピーはmemsetでできると思うのですが、 char buf[9999]; int i=0; while(1){ memcpy(buf[i], , pkt_data, 5); i++; } これでちゃんと格納できているのでしょうか? printf("%s\n", buf[i]);では確認できませんでした。 また、最終的な目標はこれをバイナリデータとしてファイルに出力したいと考えております。 ofstream fout; fout.open("file.txt", ios::out|ios::binary|ios::trunc); if (!fout) { cout << "ファイル file.txt が開けません"; return 1; } // ファイルが開けなかったときのエラー表示 for(int i=0;i<9999;i++){ fout.write(( char * ) &buf[i],sizeof( char ) ); で合っていますでしょうか? しかし、これもファイルを確認したところうまく表示できていませんでした。

専門家に質問してみよう