int型 を charの配列型 にしたいんだけど、
そういう関数がなさそうだから、そういう動作を
するものを作ってみました。

#include <iostream.h>
main(){
int n = 123;
char c[4];
for (int i=4-2; i>=0; i--) {
c[i] = n%10+48;
n/=10;
}
c[4-1] = '\0';
cout << c;
}

char c[4]; の部分が気に入りません。
4 という数字を int n = 123; の桁数の 3+1 で
やりたいんだけど、配列の添え字は定数でないと
いけないらしく、それはできませんでした。
malloc( ) というものを使ったことがないんだけど
配列の宣言後に malloc() とかで配列のメモリを
変える方法があったら教えてください。

全体的に、int型 を charの配列型 にする考え方で
もっとよい方法とか、それをする関数があれば
教えてください。
vecter( ) を使った場合では、出力する時に、
cout << hairetu[0];
cout << hairetu[1];
cout << hairetu[2];
というふうにしないとだめみたいで、普通の配列と違って
cout << hairetu;
で出力できなかったから vecter( ) 以外の方法を知りたいです。

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

A 回答 (7件)

こんにちは。


sprintf()を使用すると言う点ではNo.3の方の回答で良いと思いますが、
c = (char *)malloc(strlen(n));
malloc()の引数であるstrlen(n)の部分はまずいですね。
(No.3の方申し訳ありません。。。。)

strlen()の引数はchar *であるため上記の例では意図しないアドレスを参照してしまいます。
当方の環境ではコアダンプしました。当然のことですが。

ご質問から、変換後のバイト数をきっちりと確保されたいようですが、これは一発では難しいと思います。
仮にそうされるのであれば、以下の様にすれば可能だと思います。(No.3の方のソースを流用させて頂きます)

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

main()
{

int n = 123;
char *c;
char *tmp;

tmp = (char *)malloc(20); ←適当にメモリを確保する

sprintf(tmp,"%d",n);
c = (char *)malloc(strlen(tmp)+1);
strcpy(c, tmp);
printf ("変換後=%s\n", c);

}

と言った感じでしょうか。何だか意味なさげなプログラムになってしまいましたが。すみません。やはり、桁数は地道に計算で出すしかないのかな?っと思っております。
    • good
    • 0
この回答へのお礼

ありがとうございます。
No.3 の kenji_ さんの
c = (char *)malloc(strlen(n));
は間違っているは、見てすぐにわかったけど、
それを見て、123 の桁数を使うという意味は伝わりました。
でも、
c = (char *)malloc(strlen(n+1));
でないとおかしいかなと思っていたら、
pikacchuさんは
strlen(tmp)+1
としていたから、やっぱり、123 の3桁に1を足した4が
malloc( ) の引数ですよね。

お礼日時:2001/12/12 22:01

_ak1 さんの桁数計算だと、n が 0 の時に 0 桁になってしまうので、


負数にも対応させて、こんな感じ。

int d = 1; // 桁数
int t = n;
if (n < 0) {
i = 2;
t = -n;
}
for (; t >= 10; d++) t /= 10;
    • good
    • 0
この回答へのお礼

kenji_さんの回答も_ak1さんの回答もまだ理解できていないから
inthefloiさんの回答もあまり分からなかったけど
ありがとうございました。

お礼日時:2001/12/21 21:29

c++ の方が簡単ですよ。


c++ には、文字列を扱う stream があります。まずは、実例を。

#include <strstream.h>
#include <iostream.h>

int main()
{
  strstream s;
  int i = 12345;
  s << i;
  cout << s.str() << endl;
  return 0;
}

strstream は、内部バッファ(メモリ)に情報を貯える stream です。
貯えた情報を指す char のポインタを取得するには str() メソッドを使います。
これは、strstream が抱えている領域を指しているだけですから、strstream の
インスタンスが無くなると不当な領域を指してしまいます。変換した結果を
別途、保存しておきたいのであれば、以下のような感じになります。

  char* data;
  data = new char[ strlen(s.str()) + 1 ];
  strcpy(data, s.str());

もしくは、

  char* data;
  data = strdup(s.str());

両方とも、領域を割当てていますから、別途 delete や free() が必要になります。
    • good
    • 0
この回答へのお礼

int を char * に変換する方法で、
sprintf( ) 以外にも便利なものがあったんですねー。

int main( ){
strstream s;
int n;
cout << "数字入力"; // 123
cin >> n;
s << n;
cout << s.str( ) << '\n';
char *doruzero = "";
strcat(s.str( ), doruzero); // s.str( ) がchar型ならエラーにならんはず
}

結果は

数字入力123
123

できました。


コンパイル後にメモリ確保も、malloc( ) 以外に
new が使えるのは知りませんでした。
ここで教えてもらって、初めて new というものを
使ってみました。

main( ){
int n;
cout << "数字の桁数入力"; // 3
cin >> n;
char *c;
c = new char[n+1];
printf("%#x\n", *(c+3));
cout << sizeof(c);
}

結果は

数字の桁数入力3
0x0
4

できました。


delete や free( ) での解放については
後で調べてみます。
ありがとうございました。

お礼日時:2001/12/12 23:26

kenji_さんの回答に少し補足を。



> c = (char *)malloc(strlen(n));

strlen(n) だとちょっとおかしいようで。

 int i;
 for( i = 0; n; i++ ) n /= 10;

 c = (char*)malloc( i + 1 ); // c = new char[ i + 1 ];


> sprintf(c,"%d",n);
> printf ("変換後=%s\n", c);


ついでにこれも欲しいです。
 free( c );          // delete[] c;


hwangさんの回答にも少し補足を。

> char wk[21]; /* work area */
>
> sprintf (wk, "%d", i_data);
> if (strlen (wk) > 16 ) { /* 通常は16桁で十分変換エラー */
> return (-1);

sprintfが失敗した場合, 不定なwkに対してstrlenをしてしまうことになり具合が
良くないようです。(下手すると例外)

 int len = sprintf (wk, "%d", i_data);
 if (len > 16 || len < 1) { /* 通常は16桁で十分変換エラー */

といった感じで、失敗を見る場合、戻り値で見た方がよさそうですね。
ゆーても sprintf の成否って普段見ないんでちょっと迷いました。
今回は多分以降の memcpy に備えてだとは思うんですが、sprintf での失敗でしか strlen(wk) > 16 はありえないんで、
関数成否判定のイメージを書いてみました。

ほな、横から失礼しました。
    • good
    • 0
この回答へのお礼

kenji_さんの回答がまだ理解できていないから
_ak1さんの回答もあまり分からなかったけど
ありがとうございました。

お礼日時:2001/12/21 21:27

sprintf()を使えばint型からchar型に変換可能です。


上プログラムをこれで書き換えると

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

main()
{

int n = 123;
char *c;

c = (char *)malloc(strlen(n));

sprintf(c,"%d",n);
printf ("変換後=%s\n", c);

}

こんな感じになります。
C++のようなのでmallocでなく
new演算子を使ったほうが簡単かも?
    • good
    • 0
この回答へのお礼

char *c;
c = (char *)malloc(4);
sprintf(c,"%d",n);

でできました。
malloc( ) の使い方が分かりました。
malloc( ) の引数の 4 は、while(n/10) を
使って得ることができました。

sprintf( ) で int を char * に変換する
こともできました。
ありがとうございます。

お礼日時:2001/12/12 21:55

コンパイラにより、itoaがないかもしれない


下記の方法は出来ます。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int Int_To_Char (int, char *);

int
main( argc,argv )
int argc;
char *argv[];
{
int ret = 0;
char c[20];
int i = 123;

memset (c, NULL, sizeof (c)); /* 初期値の初期化 */
ret = Int_To_Char (i, c);

printf ("変換後 = [%s]\n", c);


}
/*
*Int_To_Char ():文字列型変換(Int型→文字列)
*
*/
int
Int_To_Char ( i_data, o_buf )
int i_data;/* 変換元データ*/
char*o_buf;/* 変換先文字列*/
{
charwk[21];/* work area*/

sprintf (wk, "%d", i_data);
if (strlen (wk) > 16 ) { /* 通常は16桁で十分変換エラー */
return (-1);
}
memcpy (o_buf, wk, strlen(wk));

return ( 0 );
}
    • good
    • 0
この回答へのお礼

memset( ) も memcpy( ) も知らなかったから
まだ理解できていないけど、こんなふうに
説明よりもソースメインに書いてくれる解答は
大好きです。
ありがとうございます。

お礼日時:2001/12/21 21:24

>atoi( ) の反対をやりたい


 ANSI に、itoa(引数注意)があったと思いますが、だめなんでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
itoa( ) は知りませんでした。
itoa( ) は bcc32 で使えて、考え中です。
itoa( ) を使わない方法も考えたいです。

#include <iostream.h>
main( ){
int n;
cout << "数字入力"; // 123
cin << n;
char c[4];
itoa(c,n,10); // 123を10進として解釈し、char型の配列にする
char *doruzero = "";
strcat(c, doruzero); // c が本当にchar型ならエラーにならんはず
printf("%x",c);
cout << '\n' << c;
getchar( );
}


エラー E2094 test.cpp 5: << 演算子が使われたがクラス istream では
int 型のための定義が存在しない(関数 main( ) )
エラー E2285 test.cpp 7: 'itoa(char *,int,int)' に
一致するものが見つからない(関数 main( ) )
*** 2 errors in Compile ***

お礼日時:2001/12/12 12:57

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

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

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

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

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

Q逆Fアンテナの短絡部について

右の図のような逆Fアンテナというアンテナがありますが、これは
(1)から給電して、(2)は導体板にショートしますよね、      ━┳┓
すると(1)と(2)が直接つながったような閉ループができます。   (1)(2) 

これは家庭用コンセントの2つの穴に針金を突っ込んだ
のと同じに思えてなりません。

なぜ、逆Fアンテナは火花が飛んだりしないのですか?電源に負担はないんですか?
放射原理が全くわかりません、どうか教えてください!

私はアンテナについて勉強し始めたばかりの学生で理解できないことばかりです。
よろしくお願いします。

Aベストアンサー

1→2のところは、波長に対して無視できないほど長いので
単純にショートをした事にはなりません。
コンセントでたとえてみれば、トランスが接続されたイメージになります。

さて、アンテナを放射するものと考えると分かりにくくなります。
「場」を作るものと考えてください.
つまり、空間にエネルギーのある場を作り、
それを非常に早く変化させる事で
波を放出するのです。

逆Fでは、2~先端 がその場をつくるためのエレメントとなります。
で、2の点はアース(0Ω)です。先端は開放端(∞Ω)です。
このエレメントにエネルギーを与えるのであれば、適度な
抵抗がある場所が良いですから、
中間点(1)に給電してやります。

実際は、先端~2の1相電流と、1~2の零相電流で
空中線は解析されます。
ここらへんは良く教科書に載っている
折り返し給電線の解析例を参考にしてください.

Qchar c = 'a'; char h[1] = c; エラー

char型のものを char[]型に代入したいです。

char c = 'a';
char h[1] = c;

として、

h[0] は \x97
h[1] は \x00

にしたいです。
型変換の方法を教えてください。

Aベストアンサー

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数を確保します。
後半で、その中を初期化しています。
添え字は 0 からはじまるので、この場合、h[0] に c の内容が代入されます。
1個しか場所を確保していないので、 h[1] の位置のデータは内容が不定です。
文字列として h を扱いたいのであれば、 C の文字列には終端として 0 が必要ですから、
char c = 'a';
char h[2] = { c, '\0'};

のような書き方が必要になります。
これで、お望みのデータになると思います。

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数...続きを読む

Qネジ式F型アンテナケーブルの取り付け方教えてください

今までTVとの接続にF型プッシュプラグを使っていたのですが、映りがいいと聞いてネジ式F型アンテナケーブルを買いました。しかし、アンテナコンセントや入力端子との接続の仕方が分かりません。商品(2FF3W-BC)の箱には詳しい接続方法は書いてありません。初歩的な質問ですがお願いします。

Aベストアンサー

F型接栓に対応しているアンテナコンセントならねじが切ってあるはずです。
F型接栓プラグの六角形のところを回してねじ込みます。
それが出来ないならジャックが対応していないのでしょう。
参考URLのページのL型アダプタのようなものが必要だと思います。

参考URL:https://www.satellite.co.jp/cable-connector.html

Qchar gyou[1024];でcharの表現範囲は-128~127間でと!gyou[1024]の

#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
char gyou[1024];
int gyousuu = 0;
if ( argc < 2 ){
printf("file mei ga nai\n");
return -1;
}
fp = fopen(argv[1], "r");
if ( fp == NULL ){
printf("fopen dekinai\n");
return -2;
}
while(fgets(gyou, sizeof(gyou), fp) != NULL){
gyousuu++;
}
fclose(fp);
printf("gyousuu=%d\n", gyousuu);
return 0;
}
 以上のプログラムは行数を計算してくれるプログラムです。
  計算結果が
  gyousuu=22 とでます。
 さて、char gyou[1024];でcharの表現範囲は-128~127間ですが、
 gyou[1024]の[1024]とは関係はありますでしょうか!?
  [1024]の意味は”要素数”と参考書に鉛筆書きがありました。
 charの表現範囲である1024は、はるかに超えているみたいですが?
  dharの表現範囲を1024が超えたとしても特に問題はなさそうです!
  このプログラムは動いていますのでは正常です。
  私の
  考え方としまして、何か誤りがありますでしょうか?
  よろしくお願いいたします。

#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
char gyou[1024];
int gyousuu = 0;
if ( argc < 2 ){
printf("file mei ga nai\n");
return -1;
}
fp = fopen(argv[1], "r");
if ( fp == NULL ){
printf("fopen dekinai\n");
return -2;
}
while(fgets(gyou, sizeof(gyou), fp) != NULL){
gyousuu++;
}
fclose(fp);
printf("gyousuu=%d\n", gyousuu);
return 0;
}
 以上のプログラムは行数を計算してくれるプログラムです。
  計算結果が
...続きを読む

Aベストアンサー

> さて、char gyou[1024];でcharの表現範囲は-128~127間ですが、
> gyou[1024]の[1024]とは関係はありますでしょうか!?
ない。
1024 のほうはただ単に領域の個数を表しているだけで、読み込もうとするファイルの 1 行のバイト数がこれを超えない限り別に 1000 でも 3327 でも構わない(ある程度以上大きくなると別の問題が出てくるが)。
ただ単に 1024 = 2^10 でプログラマにはよく見る数字、かつ、普通のテキストなら 1 行が収まりそうな長さなだけ。

Qアンテナ接続端子F座型を直付型に利用するには

室内アンテナ(日本アンテナARB-200-SP)を買ったら、接続端子がF座型用でした。後で気づいたのですが私のテレビにはF座型端子がついていません。直付型用には使用する手段は無いものでしょうか。

Aベストアンサー

テレビ側のアンテナ端子は300Ωフィーダー用ですか?
だとしたら、こんなのどうでしょうか。

http://www.amazon.co.jp/%E5%85%AB%E6%9C%A8%E3%82%A2%E3%83%B3%E3%83%86%E3%83%8A-W-J73-B-YAGI-%E6%95%B4%E5%90%88%E5%99%A8F%E5%9E%8B%E2%87%94300%CE%A9/dp/B000E1IJSU/ref=pd_sbs_e_1/250-0009915-3920234

Qchar *name1[4] とchar name2[][4] の違いについて

C言語のことで質問があります。

char *name1[4]は
char *name1[4] = {"abcdefghi","jkl","l","mn"};
と宣言でき,ポインタを4つ確保した形となりました。

char name2[][4]は
char name2[][4] = {"abc","def","ghi","jkl","mno","pqr","stu","vwx"};
と4文字以内の文字列を初期化した数だけ確保した形となりました。

この結果からchar *name1[4]の意味は,char name2[][4]ではなくchar name2[4][]に近いと思いました。
しかし,char name2[4][]ではポインタを4つ確保した事にはならないみたいでコンパイルが通りません。
*name1[4]では4つのポインタを確保できるのに~と思ってしまいます。

ポインタと配列は別物と考えるべきなのでしょうか?
訳の分からない質問かもしれませんが,
何卒ご指導いただくようよろしくお願いします。

Aベストアンサー

ポインタと配列の違いというのは、変数と定数の違いのようなものです。

話を簡単にするために、一次元配列から考えましょう。

char *p1; と定義した時のp1は、いうまでもなくポインタで、
これは変数です。p1は任意の文字列を指すことができます。
char a1[4]; と配列の形で定義した場合のa1については、
a1[0]やa1[1]等を、通常のchar型の変数と全く同じように扱うことが
できます。しかし、a1自体は、例えば a1 = p1; のように値を代入する
ことができません。(逆の p1 = a1; は可能。)つまり、この場合のa1は、
変数ではなく、定数のようなものなのです。

複合的なケースについて見てみましょう。
char **q1; ポインタへのポインタ
 q1,*q1,**q1,q1[0],*q1[0],q1[0][0] のいずれも変数として
 扱うことができます。(値を代入することが文法的に許されます。
 ただし、実行時にはアクセス違反になる場合もあります。)
char q2[4][4]; 二次元配列
 q2,q2[0]は変数として扱うことができません。q2[0][0]のように
 して、初めて変数として扱えるようになります。
char *q3[4]; ポインタの配列
 q3は変数として扱うことができませんが、q3[0],*q3[0],q3[0][0]
 はいずれも変数として扱うことができます。
 なお、この定義は char *(q3[4]); とした場合と全く同じ意味です。
char (*q4)[4]; 配列へのポインタ
 q4,(*q4)[0],q4[0][0]はいずれも変数として扱うことができます。
 しかし、*q4,q4[0]は変数として扱うことができません。

char *name1[4]; と char name2[4][]; は確かに似ています。しかし
違うところもあります。それは、name1[0] が変数として扱えるのに
対し、name2[0] には値を代入できないという点です。(データの
具体的な構造については、inthefloiさんが書いておられる通りです。
> char name2[4][]ではポインタを4つ確保した事にはならないみたい
というのも、全くその通りで、配列の定義では、ポインタ変数の領域
を確保する余地はないのです。

ポインタと配列の違いというのは、変数と定数の違いのようなものです。

話を簡単にするために、一次元配列から考えましょう。

char *p1; と定義した時のp1は、いうまでもなくポインタで、
これは変数です。p1は任意の文字列を指すことができます。
char a1[4]; と配列の形で定義した場合のa1については、
a1[0]やa1[1]等を、通常のchar型の変数と全く同じように扱うことが
できます。しかし、a1自体は、例えば a1 = p1; のように値を代入する
ことができません。(逆の p1 = a1; は可能。)つまり...続きを読む

QF型接線とBSアンテナの調整について

地デジテレビの接続部であるF型接線を自分で作成したのですが、その接線に不具合があった場合、テレビとの接続時にテレビまたはアンテナに何かダメージが発生するのでしょうか?それと地デジアンテナやBSアンテナの近くの立木(両方共、前方約4m弱)はアンテナ調整時の障害となるのでしょうか?明日、購入したテレビが到着するのですが、非常に気になってます。宜しくご教授下さい。m(._.*)mペコッ

Aベストアンサー

同軸ケーブルにF型接栓を加工して接続しましたら、テレビなどに接続
する前にテスターで導通をチェックします。
1)チェック方法
・[F栓の外側(金属部分)]と[F栓の中心線(銅の芯)]の間にテスタ棒を接触
させます。

2)測定結果の判定
・テスターの導通が無くて、無限大(∞Ω)であれば使用可能です。
・導通(0Ω~数kΩ)など場合は、工作に失敗しています。やり直しです。

UHF(地デジ)アンテナ
・UHFアンテナは放送塔の方向に向けます。
・放送塔の方向はお住まいの地区により異なります。
・木を避けて屋根の上などの場所にUHFアンテナを立てる必要があります。
・次のURLをクリックしますと、都道府県名から放送塔の方向が確認できます。

[地デジのエリア]
http://vip.mapion.co.jp/custom/DPA_B/


BS/CS110度放送用パラボラアンテナ
・頭上(天空)にある静止衛星から電波が送信されています。
・南側のベランダか、屋根の上に[パラボラアンテナ]を立てます。
・次のURLをクリックしますと、アンテナの設置要領が判ります。

[パラボラアンテナの方向]
http://www.yagi-antenna.co.jp/method/pdf/9_1.pdf

[パラボラアンテナとUHFアンテナの接続例]
http://www.yagi-antenna.co.jp/method/pdf/7_3_2.pdf

同軸ケーブルにF型接栓を加工して接続しましたら、テレビなどに接続
する前にテスターで導通をチェックします。
1)チェック方法
・[F栓の外側(金属部分)]と[F栓の中心線(銅の芯)]の間にテスタ棒を接触
させます。

2)測定結果の判定
・テスターの導通が無くて、無限大(∞Ω)であれば使用可能です。
・導通(0Ω~数kΩ)など場合は、工作に失敗しています。やり直しです。

UHF(地デジ)アンテナ
・UHFアンテナは放送塔の方向に向けます。
・放送塔の方向はお住まいの地区により異なります。
・木を避けて屋根の上などの...続きを読む

Qstd::cout << p と std::cout << *p の違

std::cout << p と std::cout << *p の違いは?

VC++でコードを書きながらC++を学んでいます。
ポインタで疑問に思ったことがあるので質問させて下さい。

int* p;
int n = 100;
p = &a;

上記のように変数を宣言・代入した場合、
std::cout << p と std::cout << *p のどちらでも"100"と表示されます。
これら二つの違いは何でしょうか?
本来*pとすべきところをpにしてもVC++が気を利かせて
&pのアドレスに入っているデータを表示してくれているということでしょうか?

Aベストアンサー

No.1氏の回答にあるコードを元に答えます。

>この場合&pでもアドレスが表示されると思うのですが、
>「&p」と「p」の違いは何でしょうか?
pはaのアドレス。
&pはpのアドレス。
(「p = &a」では、どこのアドレスを渡しているのか考えてみて下さい)


「&p」と「p」の違いというのが参照とポインタの違いを聞いているのだとしたら、constのポインタ==参照型で良かったと思います。
p = &a; //OK
&a = p; //error
int* const p2 = p;
p2 = &a; //error

QBSアンテナ bsa f55の受信不具合について

1か月前に、突然映らなくなりました
その時は、アンテナとケーブルの接続部を脱着して解消できました
今日また、映らなくなり同じことをしましたが解消できません

ネットで調べるとコンバータの事が書かれていますが
アンテナに接続しているケーブルは同軸ケーブルのみで、
ブルーレイレコーダに接続されています

この場合、何を確認してアンテナの故障かどうか判断できるのでしょうか?
アンテナ:Toshiba BSアンテナ bsa f55

Aベストアンサー

>この場合、何を確認してアンテナの故障かどうか判断できるのでしょうか?
アンテナ:Toshiba BSアンテナ bsa f55

いろいろ苦労されているようですが、不調の時は基本に帰って、問題を解決する必要があります。

まず、アンテナとTVを今お使いのケーブルは使わず、最短長さのケーブルで接続してみることをおすすめします。
その為にはTVをアンテナのところに持っていくか、アンテナをTVのあるところの近くに持ってくることが必要です。

この最良条件で映らなければ、なにをしてもダメ。 映れば序々に条件を変えていけば不具合箇所が判ってくるはずです。

Qint main(int argc, char* argv[]) についての質問

こんにちは.つね日ごろ思っている質問させてください.
Cの参考書には,
(1)
void main(void)
{
}

(2)
int main(int argc, char* argv[])
{
return 0;
}
の2つのパターンが記載されていますが,
どういう違いがあるのでしょうか?

(1)の場合main関数は,型を持たず,引数も持たない.
※Turbo Cなどのコンパイラーでは,
return文がないと警告出ます.
(2)の場合は,int 型をかえし,引数はint型 変数と char型ポインタ配列(?)
を指定している.
といったくらいしか分かりません.

(2)に関してもう少し述べれば,
コマンドラインからファイルを指定し,実行することが
できると勉強した記憶があるのですが,
理解があいまいです.

特に(2)の場合のmain関数の意味と,その使い方について
アドバイスお願い致します.

Aベストアンサー

> (1)
> void main(void)
  ...
> (2)
> int main(int argc, char* argv[])
  ...
> の2つのパターンが記載されていますが,どういう違いがあるのでしょうか?

(1) は、間違いです。少なくとも ANSI-C の規格に合致していません。

main() は、特別な関数で、ANSI-C の規格では以下の三通りのうちのどれか
でなくてはいけない、と定められています。

int main(void)
int main(int argc, char *argv[]);
int main(int argc, char *argv[], char *envp[]);

因みに三番目の形式では、三つ目の引数には環境変数が入ります。
以下のようなコードで確認ができます。

int main(int argc, char *argv[], char *envp[])
{
  int i = 0;
  while (envp[i]) {
    printf("envp[%d] = '%s'\n", i, envp[i]);
    ++i;
  }
  return 0;
}


> ※Turbo Cなどのコンパイラーでは,return文がないと警告出ます

Turbo C は、規格に厳格なのでしょう。返り値が void なのはおかしいので、
int だとみなすよ、という警告も出てるはず。で、int が帰り値だとみなし
ているので return が無いと、返り値が不定になるよ、と警告を出している
のでしょう。

> (1)
> void main(void)
  ...
> (2)
> int main(int argc, char* argv[])
  ...
> の2つのパターンが記載されていますが,どういう違いがあるのでしょうか?

(1) は、間違いです。少なくとも ANSI-C の規格に合致していません。

main() は、特別な関数で、ANSI-C の規格では以下の三通りのうちのどれか
でなくてはいけない、と定められています。

int main(void)
int main(int argc, char *argv[]);
int main(int argc, char *argv[], char *envp[]);

因みに三番目の形式では、三...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング