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

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

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

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

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

2回答

1082閲覧

配列のポインタ利用について、コード確認お願いします

wa-iwa

総合スコア4

C

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

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/01/18 11:01

編集2020/01/18 11:24

実現したいこと

1.コマンドライン引数を持ったmain関数を用意する
2.main関数にて、自作関数(Cmd_output)を呼び出す
※自作関数(Cmd_output)にコマンドライン引数を渡す
3.自作関数(Cmd_output)にて、渡したコマンドライン引数の中身を表示する

該当のソースコード

C言語

1#include <stdio.h> 2 3//関数の宣言 4void Cmd_output(int argc, char* argv[]); 5 6main(int argc, char* argv[]) 7{ 8 //main関数のコマンドライン確認 9 printf("main>argc引数の個数:%d\n", argc); 10 printf("main>argvの中身[1]:%s\n", *(argv + 1)); 11 12 //自作関数呼び出し 13 Cmd_output(argc, argv); 14} 15 16 17void Cmd_output(int argc, char* argv[]) 18{ 19 //自作関数のコマンドライン確認 20 printf("Cmd_output>引数の個数:%d\n", argc); 21 printf("Cmd_output>argvの中身[1]:%s\n", *(argv + 1));  22} 23

###実行結果

■Visual_Studio_2019のデバッグコンソールにて

main>argc引数の個数:6
main>argvの中身[1]:a
Cmd_output>引数の個数:6
Cmd_output>argvの中身[1]:a

補足情報

■開発環境
Win10/Visual_Studio_2019

■*(argv + 1)について
学校の方針でargv[1]など、添え字の利用を禁止されているので上記の様に記述しました

■懸念事項
学校のPCにて上記のコードでデバッグを行うとエラー(例外がスルーされました等)が出てしまい、不安になったため
こちらで質問させて頂きました。
自宅のPC(上記の開発環境は自宅のPCです)だと、問題なくデバッグ出来ております。
ちなみに学校のVisual_Studioは2019ではなかった気がしますが、関係ありますか?

※学校PCで表示されるエラーについてですが、自宅PCでも同エラーが出ると思っていた為
エラーの詳細内容を控えてきませんでした…申し訳ございません。

どうぞご回答お願い致します。

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

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

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

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

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

y_waiwai

2020/01/18 11:04

提示のコードではどういう動作をするんでしょうか
y_waiwai

2020/01/18 11:06

エラーが出るならエラーメッセージを提示しましょう
wa-iwa

2020/01/18 11:18

コメントありがとうございます。 大変失礼いたしました、上記の様に内容を修正いたしましたので お手数ですが改めてご確認をお願い致します。 また、エラーメッセージについて質問内容にも追加したのですが 自宅PCでも同エラーが出ると思っていたため、詳細内容を控えてきませんでした。 拙い内容で申し訳ございませんが、出来る限りでお力添えを頂けると嬉しいです。
guest

回答2

0

このプログラムは動くかもしれませんし、動かないかもしれません(実行環境に依存すると思います)。

このプログラムを、引数なしで実行したら、どのような結果になると考えられますか?

もう少し突っ込むと、引数無しの時の argv[1] の値はどのようになっていると考えられますか?

投稿2020/01/18 12:05

編集2020/01/18 12:06
TsukubaDepot

総合スコア5086

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

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

wa-iwa

2020/01/18 13:20

コメントありがとうございます。 やはり実行環境で差が出てしまうのですね… 試しに引数なしで実行してみました。 結果はエラー等は出ず、コンソール画面も開きましたが、画面上には何も表示されていませんでした。 コードを、argv[0]の値を表示するように修正したところ
wa-iwa

2020/01/18 13:23

(すみません、入力途中で送信してしまいました) argv[0]はプロジェクトのアドレス(?)を表示し、 argv[1]はnullと表示されました。 私自身もコマンドライン引数を渡さない場合、argvにははプロジェクトのアドレス(?)のみ が格納されると考えていたので、結果としては期待通りなのですが… なにか誤認識等をしていますでしょうか???? それであればご指導頂ければ幸いです。
TsukubaDepot

2020/01/18 13:43 編集

ちょっと調べ直してみました。 以前は、argv[argc]の値は「不定」でしたが、ISO Cの規格書では、次のように規程されているようです。 argv[argc] shall be a null pointer. つまり、argv[argc]はNULLポインタとなっているので、不定ではないということでした(ただし、全てのコンパイラがこの規格に沿っているわけではないので、処理系依存であることには変わりないとおもいます)。 指摘が不十分で申し訳ありません。 言いたかったことは、argv[]の添字を決め打ちするのはよくない(今回はargv[1]なので実質的な問題はありませんが)ことを考えて欲しかった、ということです。
majiponi

2020/01/18 14:34

いや、規格に沿ったコンパイラでも問題が起きるわ。printf("%s", NULL);で実行すれば分かるけど、printfはヌルポインタの検査をするか分からないから、そのままアクセスしようとすれば落ちるわよ。
wa-iwa

2020/01/18 15:31

tsukubadepotさま ご丁寧にありがとうございます! なるほど、学校でargv[]の添え字を決め打ちした記述が禁止されていたのは この様な理由からだったのですね…勉強になりました。 ちなみに *(argv + 1)のような書き方では問題ないでしょうか?
wa-iwa

2020/01/18 15:33

majiponiさま コメントありがとうございます。 printfではnullを検査できず、そのままアクセスすると無限処理になってしまい落ちる… という理解でよろしいでしょうか…? ちなみに今回作成した私のコードに何か不備はありますでしょうか? 良ければご指導頂ければと思いますので、どうぞよろしくお願いいたします。
TsukubaDepot

2020/01/18 15:36

majiponiさん: 確かにご指摘の通りですね。ライブラリ側の実装はまた別の話ですよね。
TsukubaDepot

2020/01/18 15:49

wa-iwaさん: 決め打ちでも、変数を使って指定しても、そこに意図したデータがなければ問題は発生しますよ。 それは、argv[なんとか] でも *(argv + なんとか) でも同じです。
guest

0

全角空白が含まれている以外は、プログラムに悪いところは無いので、実行の仕方に問題があったと思われます。

投稿2020/01/18 11:49

otn

総合スコア84505

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

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

wa-iwa

2020/01/18 11:52

なるほど… 全角空白の可能性もありますね。 学校で入力したコードを再度見直したいと思います! また、プログラム自体に問題はないと言って頂けて 一安心しました。ありがとうございます! 実行の仕方についても再確認致します。 この際は貴重なお時間を頂き、ありがとうございましたmm
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問