プロが教えるわが家の防犯対策術!

独習Cを使って勉強しているんですが、コマンドライン引数の意味がわかりません
本に書いてある通りプログラムしても、エラーが出てしまいます
コマンドライン引数ってなに?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

OSはWindowsを使っているならば、


・Windowsキー + [R]
・cmdと入力
・リターン
で、コマンドプロンプトが表示されます。

あるプログラムを実行する際は、
>c:\****\sample.exe
※****はご自身の環境に読み替えてください
とするとおもいますが、sample.exeの後に半角スペースを
入れてプログラムにデータを渡すことができます。
例)
>c:\****\sample.exe aaa bbb

この場合、sample.exeのC言語のmain関数を
int main(int argc, char *argv[])
などと定義した場合、aaaはargv[1]で、bbbはargv[2]で
参照可能です。(argv[0]にはsample.exeのパスが入っています)

プログラムは、ユーザーが起動時に指定するデータを元に
いろいろと処理することが可能なります。
(たいていはオプション指定に使われることが多いと思います)
    • good
    • 0

> コマンドライン引数ってなに?



プログラム実行時に、プログラムに与えるパラメータのことです。

例えば当該図書の7.4章の最初のサンプルch17-16.c
------
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){

int i;

for ( i = 1; i < argc; i++)
printf("%s ", argv[i]);

return 0;
}
------
をコンパイルしてできた、ch17-16.exeを下記の様に実行するとした場合
「abc」「def」「ghi」がコマンドライン引数になります。

実行:
ch17-16.exe abc def ghi

実行結果:
abc def ghi
    • good
    • 1

単純に、hoge というプログラムを実行する時には


hoge[Return]
と入力しますが
hoge foo xyz[Return]
と入力すると、"foo", "xyz" がプログラム起動時に引数として渡されます。

例)
int main(int argc, char *argv[])
と記述されていた場合、変数値は
argc = 3
argv[0] = 'hoge'    ;プログラム名
argv[1] = 'foo'
argv[2] = 'xyz'
となります。

>本に書いてある通りプログラムしても、エラーが出てしまいます
どんなエラーが出ていますか?
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Q構造体配列の安定なソート

出席番号と得点の配列を持つ構造体配列で、
出席番号順に並んだ状態でqsortを使って得点をソートする場合、
同じ得点の人でも、出席番号順はばらばらになってしまいますよね。

調べてみて、バブルソートなど安定なソートを使えばいいということが分かったのですが、
qsortは標準ライブラリにあって、
比較関数も見よう見まねで作ってなんとかなったのですが、
他の方法となると具体的にどうすればいいのか、
よくわからない状況です。

http://homepage1.nifty.com/daccho/program/algo/sort3.htm

こちらのサイトのソースファイルを見て、
普通のint配列のバブルソートは出来たのですが、
構造体配列を、構造体の中の一つの要素をキーにバブルソートできるようにするには、
ここからどのように変更すればいいのでしょうか?

並び替える内容はint型だけなので、文字列をソートできるようにする必要はなく、
ソート対象も少ないので(上限100程度)、速度的な問題は考慮しなくて大丈夫だと思います。

Cは勉強中で、基本文法がわかるぐらいという状況で、
もしかしたら変なことを言っているのかもしれませんが、
よろしくお願いします。

出席番号と得点の配列を持つ構造体配列で、
出席番号順に並んだ状態でqsortを使って得点をソートする場合、
同じ得点の人でも、出席番号順はばらばらになってしまいますよね。

調べてみて、バブルソートなど安定なソートを使えばいいということが分かったのですが、
qsortは標準ライブラリにあって、
比較関数も見よう見まねで作ってなんとかなったのですが、
他の方法となると具体的にどうすればいいのか、
よくわからない状況です。

http://homepage1.nifty.com/daccho/program/algo/sort3.htm

...続きを読む

Aベストアンサー

>構造体のメンバを引数に渡すにはどうすればいいかとか、
>bubble_sort(&table[0].score, 10);
bubble_sort(&table[0], 10)
とすればいいと思います。
>メンバの配列を比較してメンバの順番だけ入れ替えたら、
>名前と得点の対応が壊れるから、
構造体自体は、出席番号と得点を保持しているのだから、
出席番号から名前が引き出せるのであれば、対応をとる必要はないと思うのですが、構造体の配列の並びがどっか別にある名前テーブル(配列?)と対応しているということであれば、名前テーブルも並び替える必要があるのかなぁとか思いますが、そんな必要はないような気がします。
なんか、どういうデータ構造になっているかよくわからないので、勘違いしてたらすみませんです。
できたら、バブルソート版のプログラムを補足していただけますか?

Q構造体のメンバにファイルポインタがあるときの初期化について

#include<stdio.h>
typedef struct file{
FILE *fp;
char filename[255];
int flag;
}sFILE;
main()
{
sFILE fp={ ,"output.txt",1100};
}

のように書きたいんですが、sFILE fp={ ,"output.txt",1100};の最初のファイルポインタのところは何を入れたらいいんでしょうか?

Aベストアンサー

正直、構造体に FILEポインタ持たせる利点が分からないのだけど、
とりあえず NULL でいいんじゃないでしょうか、。

こんな感じ
sFILE fp={NULL,"output.txt",1100};

Qコマンドライン引数って・・・?

java言語を勉強中です。
コマンドライン引数って何ですか?
検索しても本を読んでもイマイチ理解できません…。

どこの部分に、どの様な形式で記入すればいいのでしょう?
またその記入によって何が実行されるのですか?

すいませんが、全くの初心者なので分かりやすく説明して
頂けませんか?
宜しくお願いします。

Aベストアンサー

引数で何が実現できるかと。

たとえば、3の2乗を計算するプログラムがあるとします。
処理は、3×3 = 9 で、9が結果として返ってきます。
答えはいつも9です。
計算できるのは、3の2乗だけです。
このプログラムができることは、それだけ。
こんなプログラムは正直要りません。欲しくないです。
こんな書き方だと、数がかわるたびにいちいちプログラム作りなおし
です。

われわれが欲しいのは、
ある数を与えられたらその数を2乗した結果を返してくれる
といったプログラムです。
157を与えたら、157の2乗の24649を答えとして返してくるし、
233を与えたら、233の2乗の54289を答えとして返してくる。
与える数とか条件とかを変えると、それに応じて結果を返して
くるプログラムです。

具体的には、Jijyoという名前のjavaプログラムだとして

>java Jijyo 157

とかコマンド(命令)を書けば、

24649

と答えが返ってくると素敵ですね。

この

>java Jijyo 157

の 157 の文字。プログラムに値を渡しているこれ。これが引数です。

こういうコマンドで実行するプログラムのとき、上の 157 の値の
ようにプログラムに渡してやる値。これが「コマンドライン引数」
ではないでしょうか。

プログラム実行時に渡した引数は、
#1さんのご説明のコードを拝借すると、String[] args というところ
(これは、String型の配列argsを意味するのですが)ここにこの引数の値が入ってきます。
引数を利用するときは、続く処理でこのargsから、値を取り出して使います。

以上

引数で何が実現できるかと。

たとえば、3の2乗を計算するプログラムがあるとします。
処理は、3×3 = 9 で、9が結果として返ってきます。
答えはいつも9です。
計算できるのは、3の2乗だけです。
このプログラムができることは、それだけ。
こんなプログラムは正直要りません。欲しくないです。
こんな書き方だと、数がかわるたびにいちいちプログラム作りなおし
です。

われわれが欲しいのは、
ある数を与えられたらその数を2乗した結果を返してくれる
といったプログラムです。
157を与えたら、...続きを読む

Q2次元配列の文字"列"の初期化方法

こまかな話しかもしれないのですが、2次元配列の文字列代入で、

char *array2 = {"Jan", "Feb", "March"}; //NG
はNGで
char *array2[3] = {"jan,", ...}; //OK
なのはどうしてなのでしょうか?

1: "[3]"は明示しなくとも代入される値から分かるという理由で省略してはいけないのでしょうか?

また、
2: 一次元の場合
char *array = "aaaaa";
とできるのにどうして2次元ではNGなのか、がピンと来ません。

すみませんが、宜しくお願い致します。

Aベストアンサー

>こまかな話しかもしれないのですが、2次元配列の文字>列代入で、
>
>char *array2 = {"Jan", "Feb", "March"}; //NG
>はNGで
>char *array2[3] = {"jan,", ...}; //OK
>なのはどうしてなのでしょうか?

上記は、2次元配列ではなくて、『ポインタ配列』の初期化代入です。

2次元配列であれば、
char buf[][8] = {"BLACK","BLUE","RED"};
のように、します。


一般的に、
       "文字列"
という表現は、
      文字列+ヌル文字
が記憶された場所を表すchar *のポインタになりますが、例外があります。

配列要素を初期化するときに、char * と見なすか、単なる連続文字列と見なすか、です。

代入すべき値がポインタの場合に、char *となります。
  char *p = "AAAA";

char *bufp[] = { "AAAA" , "BBBB" , "CCCC" };
です。

連続文字列として考えるときは

char buf[] = "AAAAAAAAAA";



char buf[][8] = {"BLACK","BLUE","RED"};

のような場合です。
上記の場合、8文字に満たない場合はヌル文字が補われます。

[BLACK000] [BLUE0000] [RED00000]

のようになります。

>こまかな話しかもしれないのですが、2次元配列の文字>列代入で、
>
>char *array2 = {"Jan", "Feb", "March"}; //NG
>はNGで
>char *array2[3] = {"jan,", ...}; //OK
>なのはどうしてなのでしょうか?

上記は、2次元配列ではなくて、『ポインタ配列』の初期化代入です。

2次元配列であれば、
char buf[][8] = {"BLACK","BLUE","RED"};
のように、します。


一般的に、
       "文字列"
という表現は、
      文字列+ヌル文字
が記憶された場所を表すchar *のポインタにな...続きを読む

Qmain関数終了時のreturnの意味は?

質問の題名通り、main関数終了時のreturnの意味が知りたいです。いつもは参考書に書いてある通り、return 0とやっていたのですが、参考書のサンプルプログラムでreturn 1というのがでてきた為、少し混乱しました。
参考書に説明が載っていないのでmain関数内でのreturnの意味をご教授願いたいです。よろしくお願いいたします。

Aベストアンサー

# 4です。

まず、0を返そうが、1を返そうが、そのプログラム自体の内部的な動作は通常変わりません。
戻り値で動作が変わる可能性があるのは「そのプログラムを呼び出したプログラム側」です。

例えば、make から呼び出された場合にそのプログラムが0以外が返したら、makeは「そのプログラムは失敗した」と考えて、処理を中断したりします。(続けて欲しいなら「成功」を返す、こういうために使います)
コマンドラインからあなたが手で入力したのなら、何も起きないかもしれません。

1を伝えられたOSが何をするかは環境(OS)によります。
gccは、Windows版もLinux版も各UNIX版もあるようなコンパイラですから、その版によって違う可能性があります。
ちなみに、手元の Minimalist GNU for Windows では 1 は EXIT_FAILURE でした=つまり前述のような失敗。
別のOS上のgccでは別の値にポートされている可能性も否定はできません。

C言語が保証しているのは、EXIT_SUCCESSを返したとき、その環境では成功と判断してくれるだろう値を返すことと、EXIT_FAILUREのときは失敗と判断してくれるだろう値を返すことだけです。
0は通常EXIT_SUCCESSですが、1はEXIT_FAILURE とは限りません(現実的には 0 と 1 が大半だと思いますが、EXIT_FAILUREが-1とかでも違反ではないです)。
但し、実際に判断できるかはOSにもよりますし、呼び出したプロセスがどう判断するかにもよります。

なお、Windows や Linux, その他私の知っている UNIX では、1を返されたからといって必ず何かが行われるということはありません。
前述のように、別のプログラム等から呼び出された場合に、そのプログラムが失敗と判断して何か処理を行う可能性はありますが、これらはあくまで呼び出し元のプログラムによります。
ITRON等の組込みOSでは、main が値を返す事は通常ありません。

憶測ですが、参考書のサンプルで return 1;となっているのは、例えば argv が求めているものと違うとか、fopen に失敗したとか、そういうケースではありませんか。
そういう異常処理が発生した場合に、もしも呼び出したプログラムがいたらそれを伝えられるように、EXIT_SUCCESS (0)以外の値を返すのは慣習です。
具体的にどんな値を返すかは、プログラムの設計次第になってしまいますが、1や-1を返したり、失敗原因ごとに決めた値を返したりします。
汎用性を重視するならEXIT_FAILURE等もありますが、知名度もやや低いですし、0以外なら何でもいいという認識の人も多いように思いますので、サンプルは単に1を返しているのではないかと。

# 4です。

まず、0を返そうが、1を返そうが、そのプログラム自体の内部的な動作は通常変わりません。
戻り値で動作が変わる可能性があるのは「そのプログラムを呼び出したプログラム側」です。

例えば、make から呼び出された場合にそのプログラムが0以外が返したら、makeは「そのプログラムは失敗した」と考えて、処理を中断したりします。(続けて欲しいなら「成功」を返す、こういうために使います)
コマンドラインからあなたが手で入力したのなら、何も起きないかもしれません。

1を伝えられたOSが...続きを読む

Qファイルから読み込んだデータを構造体に格納できますか?

1レコード19バイトのファイルを
読み込む処理を行っています。

地区名10バイト
県名8バイト
改行1バイト

このデータをdouken(構造体)に格納したいのですが
>while (fgets(dou,19,fp) != NULL){
で、エラーになってしまいます。

どのようにしたら
ファイルから読み込んだデータを
構造体に格納できますか?


#include<stdio.h>
#include <stdlib.h>

struct douken {
char tiku[10];
char ken[8];
}

main(void){

FILE *fp;
struct douken dou[100];
int i;

fp = fopen("ex3.fil","rb");

if ( fp == 0 ){
printf("can't open\n");
exit(1);
}

while (fgets(dou,19,fp) != NULL){



1レコード19バイトのファイルを
読み込む処理を行っています。

地区名10バイト
県名8バイト
改行1バイト

このデータをdouken(構造体)に格納したいのですが
>while (fgets(dou,19,fp) != NULL){
で、エラーになってしまいます。

どのようにしたら
ファイルから読み込んだデータを
構造体に格納できますか?


#include<stdio.h>
#include <stdlib.h>

struct douken {
char tiku[10];
char ken[8];
}

main(void){

FILE *fp;
struct douken dou[100];
int i;

...続きを読む

Aベストアンサー

>>while (fgets(buffer,20,fp) != NULL){
>と、するということですか?
>その場合、
>ここのサイズは必ず4の倍数になるということですよね?
構造体を直接扱うと、アーキテクスチャやコンパイラ依存してしまいます。
32bit機なら4byteですし、16bit機なら2byte。64bit機なら8byteです。
また、コンパイラの設定によってもどのように確保されるかまったく分からないのです。
一度バッファに蓄えてからmemcpyでコピーする方が安全ですし、可搬性があります。
C言語では\0を文字列の終端文字として使用しているので、10文字格納したいなら11byte確保する必要もあります。
簡単に修正してみました。

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

typedef struct douken_ {
char tiku[11];
char ken[9];
} douken;

int main(void){
FILE *fp;
douken dou [100];
char buff [18 /* douken */ + 1 /* LF(\n) */ + 1 /* \0 */];
int i;
i = 0;

fp = fopen("ex3.fil","rb");

if ( fp == 0 ){
printf("can't open\n");
exit(1);
}

// douを\0で埋める
memset (dou , '\0' , sizeof dou);

// 一度バッファに格納
while (fgets(buff,sizeof buff,fp) != NULL){
// memcpy関数でコピー
memcpy(&dou[i],buff,10);
memcpy(&dou[i],buff+10,8);

// 構造体配列より大きなファイルを開いたときの配慮
if (i == 99) break;
i++;
}

return 0;
}

>>while (fgets(buffer,20,fp) != NULL){
>と、するということですか?
>その場合、
>ここのサイズは必ず4の倍数になるということですよね?
構造体を直接扱うと、アーキテクスチャやコンパイラ依存してしまいます。
32bit機なら4byteですし、16bit機なら2byte。64bit機なら8byteです。
また、コンパイラの設定によってもどのように確保されるかまったく分からないのです。
一度バッファに蓄えてからmemcpyでコピーする方が安全ですし、可搬性があります。
C言語では\0を文字列の終端文字として使用して...続きを読む

Qファイル出力の場所を指定

現在C++にてhtmlファイルを出力するプログラムを作っているのですが、出力場所を指定することはできるのでしょうか?(現在はそのプログラムソースが保存されている場所と同じファイル内に出力されますが、それをデスクトップに出力するなど。)
もし、方法がありましたら、教えてください。
ソースや参考HPのURLなどのせていただけたらありがたいです。
環境はVisualStudio.NET2003です。
よろしくお願いします。

Aベストアンサー

単にファイル名の前にパスを指定する。

絶対パス指定
fp=fopen("c:/temp/test.txt","w");

相対パス指定
fp=fopen("./hoge/test.txt","w");


デスクトップはOSやユーザによって場所が異なるので、少し面倒です。
XPの場合環境変数を利用してこんな感じで出来ると思います。

例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{
FILE *fp;
char fname[1024];
strcpy(fname,getenv("USERPROFILE"));
strcat(fname,"/デスクトップ/test.txt");
fp=fopen(fname,"w");
//処理
fclose(fp);
}

Qcharと%c , %s の関係について

char型の変数の扱いで悩んでいます。
具体的には以下の二つのプログラムの差異についてです。

----------------------
char c;

scanf("%c", &c);
printf("%c\n", c);

-----------------------
char c;

scanf("%s", &c);
printf("%s\n", &c);

-----------------------


上のプログラムは正しいと思うのですが、下のプログラムが正しいのかどうか、わかる方に教えていただきたいと思い質問させていただきました。

どちらのプログラムも問題なく動作します。
僕自身は 下のプログラムの printf 関数については間違った使い方なのではないかと思っています。

scanf("%s", &c) は入力された文字のうち、終端文字の手前までの文字を引数のポインタが示すオブジェクトへ順に格納していく関数だと理解しているので、入力された文字が一文字だった場合、&cの示すオブジェクトに文字が代入されると考えたからです。

逆に printf("%s", &c) は、&cの示すオブジェクトから”ヌル文字”の手前までの文字列を順に表示する関数だと理解しているので、問題なく動作しているのは&cで示されるオブジェクトの後ろの領域が偶然'\0'だったからではないかと考えたからです。

何かの本で、未使用の領域は0である確率が高いという記述をみたことがあり、'\0'は0と同じだということなので問題なく動作する率が高いのではないかと思っています。


僕の考え方がどの程度正しくて、正確にはどうなのかを教えて欲しいです。


ちなみに、

-----------------------
char c;
char str[100];

scanf("%s", str);
scanf("%c", &c);
------------------------

と書くと c には改行文字が代入されてしまいます。
scanf("%s", str);
において"aasssdd "と最後に空白を入れると
c には空白文字が代入されます。

しかし、
--------------------------
char str1[100];
char str2[100];

scanf("%s", str1);
scanf("%s", str2);
--------------------------
においては、
scanf("%s", str1);
で "asdfg "と最後に空白を入れても次のstr2が空白で始まることはありません。


この辺りの処理がどのような法則で実行されているのかが分かりづらくて悩んでいます。
おそらく、
scanf("%s", str);
の場合には最初の文字が空白や改行文字でも、その次に有効な文字があればそれらの改行や空白を無視するのではないかと思っています。


分かる方がいましたら回答をよろしくお願いします。

char型の変数の扱いで悩んでいます。
具体的には以下の二つのプログラムの差異についてです。

----------------------
char c;

scanf("%c", &c);
printf("%c\n", c);

-----------------------
char c;

scanf("%s", &c);
printf("%s\n", &c);

-----------------------


上のプログラムは正しいと思うのですが、下のプログラムが正しいのかどうか、わかる方に教えていただきたいと思い質問させていただきました。

どちらのプログラムも問題なく動作します。
僕自身は 下...続きを読む

Aベストアンサー

> char c;
> scanf("%s", &c);
char c では1文字分の領域しか確保されていないので、
1文字以上の文字列を無理矢理格納すると
他のデータが存在しているかもしれない領域を書き換えてしまいます。(メモリ破壊)

なお、'\0'はscanfが(本来書き込んではいけない領域に対してですが)書き込んでいます。


> と書くと c には改行文字が代入されてしまいます。
最初のscanfが改行文字を読み込んでいないからです。
以下のページに書かれている内容と本質的には同じ。
http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-

> 最初の文字が空白や改行文字でも、その次に有効な文字があればそれらの改行や空白を無視するのではないかと思っています。
そう考えて問題ないと思います。

Q馬鹿でもわかるようにダブルポインタを教えてください

題名のとおり↑

本当に、丁寧にサルでも犬でもキジでも桃○郎分かる説明をお願いします。

お願いします!!

Aベストアンサー

#1のzwiです。
ダブルポインタを使うときは、たいてい呼ばれた関数側でポインタを書き換えたいときに使います。

現状で、こういう状態だったとき、
(1)正面「右を見ろ→」←**パラメータのポインタポインタ変数
(2)右「下を見ろ↓」←*ポインタ変数
(3)下「ば~か。」←変数
で(2)を書き換えます。
書き換え後
(1)正面「右を見ろ→」←**パラメータのポインタポインタ変数(書き換えても呼び元には返せない)
(2)右「上を見ろ↑」←*ポインタ変数(呼び元のポインタ変数そのもの)
(3)上「お疲れ!」←変数
で参照する変数が変わることになります。

関数のパラメータを書き換えても呼び元には反映されないのは理解されていると思いますが、シングルポインタがパラメータだとそのポインタ自身は書き換えて返すことが出来ませんよね?ダブルポインタは、そんなときに使います。


人気Q&Aランキング