実現したいこと
下記の機能を持ったプログラムの作成をしたいと考えております。
機能
1.コマンドライン引数で入力された文字列を10進数の数値として取得し、入力された数値を昇順でソートする
2.入力されるコマンドライン引数の数は、最小2個、最大10個(実行ファイルは含まない)指定できる。
3.コマンドライン引数の数に過不足がある場合は異常終了をする。
4.コマンドライン引数に指定した文字列が、10進数の数値を表すもの(0~9)以外の場合は警告メッセージを出力し、対象データとして扱わない。
(対象データが2未満になったら場合は異常終了する)
困っていること
機能の14を満たすプログラムは作成いたしましたが以下のテストケースの場合のみ出力がおかしくなります。4を満たすプログラムになるのでしょうか。
期待の出力結果に0の出力は必要ないのですが0が出力されてしまいます。
どのようにすれば0を出力しないようにし、なおかつ機能1
問題のテストケース
コマンドライン入力値
プログラム名 10 4 7 a
出力結果
入力値: 10 4 7 0
ソート結果: 0 4 7 10
#include<stdio.h> #include <stdlib.h> void sort(int argc, long int *num); void swap(long int *num ,int i, int j); int strToNum(int argc, char *argv[],long int *num); int main(int argc, char *argv[]){ int i; //ループカウンタ long int num[10]; //文字変換後の数値格納用配列 /************************/ /* 引数の数チェック処理 */ /************************/ /* コマンドライン入力文字数が11以上であればプログラムの強制終了 */ if (argc > 11) { /* メッセージ表示 */ printf("Please specify from 2 to 10 of numerical value for command line arguments. "); exit(1); } /* コマンドライン入力文字数が1以下であればプログラムの強制終了 */ else if (argc < 3) { printf("Please specify from 2 to 10 of numerical value for command line arguments."); exit(1); } else{ /* 処理なし */ } /************************/ /* 数値に変換 */ /************************/ /* 引数で入ってきた文字(数値)を数字に変換 */ int count = strToNum(argc, argv, num); /***************************/ /* 変換後の数値を順番に表示*/ /***************************/ printf("Input Data:"); for (i = 0;i < argc - 1; i++){ printf("%d ", num[i]); } printf("\n"); /*********************************/ /* 変換後の数値を昇順にソートする*/ /*********************************/ sort(argc, num); /*****************************/ /* ソート後の数値を順番に表示*/ /*****************************/ printf("sort result:"); for (i = 0;i < argc - 1; i++){ printf("%d ", num[i]); } return 0; } /********************************************************************/ /* 関数名:strToNum */ /* 関数概要:コマンドラインで与えられた文字を数値へ変換し */ /* 変換した数値を配列num[]へ格納する。 */ /* 引数 第1引数 int argc :コマンドラインの要素数 */ /* 第2引数 char *argv[]:コマンドライン入力文字配列のポインタ */ /* 第3引数 long int *num:数値格納配列の先頭アドレス */ /* 戻り値: なし */ /********************************************************************/ int strToNum(int argc, char *argv[],long int *num){ int i; //ループカウンタ int count = 0;//数値入力された回数をカウント char *end; //変換が出来ない文字のポインタを格納 /***********************************************/ /* 引数の文字を数値へ変換した後に数値配列へ格納*/ /***********************************************/ /* コマンドラインで入力された文字数文だけ繰り返す*/ for (i = 0; i < argc - 1; i++){ num[count] = strtol(argv[i + 1], &end, 10); /* 入力文字列が10進数かどうかの判定 */ if ('\0' == *end){ count = count + 1; } else { printf("A number that cannot be expressed in decimal has been entered.:%s\n",argv[i+1]); } } /* 対象(10進数の文字列)が2未満かどうかの判定 */ if (count < 2){ printf("Insufficient number of input data.:%d\n", count); exit(1); } return count; } /*****************************************************************/ /* 関数名:sort */ /* 関数概要:数値型配列num[]に格納されている数値を昇順にソートする*/ /* 引数 第1引数 long int *num:数値格納配列の先頭アドレス */ /* 第2引数 int argc:コマンドラインの要素数 */ /* 戻り値: なし */ /*****************************************************************/ void sort(int argc, long int *num){ int i; //外側のループカウンタ int j; //内側のループカウンタ for (i = 0; i < argc - 1; i++){ for (j = i + 1; j < argc -1; j++){ if (num[i] > num[j]){ swap(num, i, j); } else { /* 処理なし */ } } } } /*****************************************************************/ /* 関数名:swap */ /* 関数概要:sort関数から与えられた2数を入れ替える */ /* 引数 第1引数 long int *num:数値格納配列の先頭アドレス */ /* 第2引数 int i:交換対象の要素数 */ /* 第3引数 int j:交換対象の要素数 */ /* 戻り値: なし */ /*****************************************************************/ void swap(long int *num ,int i, int j){ int tmp; //数値退避用変数 /***********************************/ /* 引数で与えられた数値を入れ替える*/ /***********************************/ tmp = num[i]; num[i] = num[j]; num[j] = tmp; }
以上になります。
回答1件
あなたの回答
tips
プレビュー