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

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

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

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

Q&A

解決済

1回答

2524閲覧

コマンドライン引数をソートし、表示するプログラムについて

ken21

総合スコア17

C

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

0グッド

0クリップ

投稿2020/10/22 04:52

編集2020/10/22 05:28

実現したいこと
下記の機能を持ったプログラムの作成をしたいと考えております。

機能
1.コマンドライン引数で入力された文字列を10進数の数値として取得し、入力された数値を昇順でソートする
2.入力されるコマンドライン引数の数は、最小2個、最大10個(実行ファイルは含まない)指定できる。
3.コマンドライン引数の数に過不足がある場合は異常終了をする。
4.コマンドライン引数に指定した文字列が、10進数の数値を表すもの(0~9)以外の場合は警告メッセージを出力し、対象データとして扱わない。
(対象データが2未満になったら場合は異常終了する)

困っていること
機能の14を満たすプログラムは作成いたしましたが以下のテストケースの場合のみ出力がおかしくなります。
期待の出力結果に0の出力は必要ないのですが0が出力されてしまいます。
どのようにすれば0を出力しないようにし、なおかつ機能1
4を満たすプログラムになるのでしょうか。

問題のテストケース
コマンドライン入力値
プログラム名 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; }

以上になります。

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

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

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

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

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

y_waiwai

2020/10/22 05:08

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
ken21

2020/10/22 05:16

修正いたしました。
dodox86

2020/10/22 05:22

> 出力結果 > 入力値: 10 4 7 0 > 出力値: 0 4 7 10 入力と出力で妥当な気はしますが、なぜ、「期待の出力結果に0の出力は必要ない」のでしょうか。機能の一覧に「数値の0は除外する」旨の記載は無いようですが。隠れた条件なのですか?
ken21

2020/10/22 05:30

質問文がよくなかったですね。 正しくは↓です > 出力結果 > 入力値: 10 4 7 0 > ソート結果: 0 4 7 10 で、この出力結果の入力値が コマンドライン入力値 プログラム名 10 4 7 a になるので機能の4を考えると > 出力結果 > 入力値: 10 4 7 > ソート結果: 4 7 10 が正しいです。
guest

回答1

0

自己解決

大変申し訳ございません。
自己解決いたしました。

sort関数の引数、sort関数のループ、出力値の表示のループ処理に
argcを用いていたことが原因でした。

投稿2020/10/22 05:42

ken21

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問