[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 06/11 11:18 / Filesize : 195 KB / Number-of Response : 805
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 21



1 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 06:24:18 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 20
pc11.2ch.net/test/read.cgi/tech/1192455273/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 99代目
pc11.2ch.net/test/read.cgi/tech/1194262698/

101 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 16:22:55 ]
>>99
メイン関数に返るのではなく呼び出した関数の呼び出した位置に返るのだよ
つまりmin(t->l)が実行されたあとにその戻り値がmに代入されてreturn mで戻り値となりそれが更に・・・
てな具合で呼び出した順を逆にたどるために各階で戻り値を返す必要があるわけだ

102 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 16:26:51 ]
>>100
数学板の方が適切だと思われ。

103 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 16:40:34 ]
>>100
まさかとは思うけど、複数の数の最大公約数の求め方を知らないという話じゃないよね?
ユークリッド互除法より最適なアルゴリズムはないのか、という話だよね?

104 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 16:58:45 ]
>>100
int gcd(int a, int b); // 引数で与えられた2数の最大公約数を返す関数
があるとして
gcd(a, gcd(b, c));
なら…

105 名前:92 mailto:sage [2007/11/10(土) 17:34:55 ]
>>101
なるほど、だからm = min(t->l);と言う様にmに代入しているのですね。
完全に理解できました。

アドバイスして下さった方、本当にありがとうございました。

106 名前:デフォルトの名無しさん [2007/11/10(土) 21:13:15 ]
等比数列の和の求め方のソースコードを載せてください。(初項a,公比r,項数nとする)

107 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 21:20:43 ]
それは宿題スレ向き

分投げじゃなくて、少しは考えよう

108 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 21:21:23 ]
>>106
丸投げは宿題スレへ
pc11.2ch.net/test/read.cgi/tech/1194262698/l50

109 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 21:52:01 ]
void foo( double* yuv, double* s1, double* w1, unsigned int size, unsigned int inc )
{
int i;

for ( i = 0 ; i < size / 2 ; i++ ) {
double d0 = *yuv;
double d1 = yuv[inc];
*s1 = ( d0 + d1 ) * sqrt( 2 ) / 2;


すいません、初歩的な質問なのですが
double yuvは1次元のポインタなのですが
double d0 = *yuv;
double d1 = yuv[inc];
のd0が何をやっているのか教えてください。
1次元の配列で *yuvとしたときに、どこを指しているのかわからなくて



110 名前:デフォルトの名無しさん [2007/11/10(土) 22:13:24 ]
等比数列の初項a,公比r、項数nをキーボードから入力して、
それらを画面に表示して最後にそれらの総和を表示する。
ただしa,rは実数値とする。

111 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:17:07 ]
>>109
*yuv は yuv[0] と同じ意味



112 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:22:48 ]
yuv[0] = *(yuv + 0) = *yuv

113 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:31:13 ]
>>111-112
ありがとうございます。理解できました。

114 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:54:23 ]
2^(3/2)って関数でかくとどうなりますか?
2^(1/2)や3^(1/2)なら sqrt(2.0)やsqrt(3.0)だとわかるのですが。

pow( sqrt(2.0),3 )になるのでしょうか?

115 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:55:49 ]
pow( 2.0, 1.5 );

116 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:55:52 ]
素直にpow(2, 3 / 2)でよろしかろ。

117 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:56:53 ]
そのままで良かったんですねw
ありがとございます

118 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:56:54 ]
いいえ

119 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:57:15 ]
おっといけねぇ。pow(2, 3. / 2)だね。



120 名前:デフォルトの名無しさん [2007/11/11(日) 00:19:30 ]
FFTで振幅が正確に得られないときはどうするの?
numerical recipeのコード使ってるんだけど、
同じ振幅で別周波数の時系列入れてもスペクトルの
大きさが違うんです。
周波数の適当なビンで積分しても違いがあるどうしてかな。
コードはいじってないよ。

121 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 00:28:07 ]
>>120
入力波形を正弦波にしてサンプリング周波数の 1/(2^n) にしてもそうなる?

122 名前:デフォルトの名無しさん [2007/11/11(日) 01:55:42 ]
超初心者な質問だけど、よろしく。

俺は情報科の1年なんだけど、
大学でやってるCを自宅でもやりたいと思ってるんだけど、
そういうのを自宅でやるのはどうすればいいの?
できれば無料でやりたいんだけど、
そんなソフトをインストールすればいいのか教えてください。

123 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 01:58:27 ]
学校で使ってるOSとかコンパイラは何?

124 名前:122 [2007/11/11(日) 02:02:02 ]
>>123
OSはXPです。
コンパイラ・・・ってなんだろ?
emacsとかktermとか使ってますけど。

125 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 02:05:55 ]
コンパイラはソースコードから実行ファイルを作るプログラム

126 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 02:07:08 ]
そのレベルで環境構築は無理だよ。素直に学校の先生に聞いてみよう。

127 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 02:08:38 ]
>>124
gccは使ってる?

128 名前:122 [2007/11/11(日) 02:28:58 ]
すみません、やっぱり今の俺には
自宅で環境整えるのは難しいみたいですね・・・。
今度聞いてみます。
こんな時間にありがとうございました。

129 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 02:37:20 ]
いや、やること自体は難しくないよ。先生に聞けば普通に解決すると思う。



130 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 02:41:18 ]
>>128
学校と同じものを揃えたいんでしょ?
とりあえず学校で何を使ってるかを調べるだけでおk

131 名前:デフォルトの名無しさん [2007/11/11(日) 03:25:58 ]
これってどこがダメなんですかね?
0が出力されてしまいます…
初心者ですみませんがよろしくです.

#include <stdio.h>

main()
{
 int i, k, sum;

 sum = 0;

 do{
  printf("正の整数kを入力して下さい:");
  scanf("%d", &k);
 }while(!(k>0));

 for(i = 1; i > k; i++){
  sum += i*i*i;
 }

 printf("kまでの自然数の3乗の和は%d", sum);
}

132 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 03:28:54 ]
>>131
i に注目。

133 名前:デフォルトの名無しさん [2007/11/11(日) 03:34:37 ]
>>132
レスありがとうございます.
でも,ちょっとわかんないです^^

134 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 03:37:53 ]
>>133
そういうときには、取り敢えずsumを更新した次の行に(その下にある)printf()の行をコピーしてみよう。
それを実行しても未だ問題点が見つからないようなら、きっと注意力不足か適正不足だと思うよ。

135 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 03:58:31 ]
>>131
不等号の向きが逆。

136 名前:デフォルトの名無しさん [2007/11/11(日) 04:03:45 ]
>>134
レスありがとうございます.
sum += i*i*i;
の下にprintfを入れてみたけど,そこの分のprintfが実行されてなさそう…
ってことは,for自体が実行されてないんですかね?

137 名前:デフォルトの名無しさん [2007/11/11(日) 04:24:04 ]
若干スレ違いかもしれないですが・・・

Borland C++ Compiler 5.5
Borland Turbo Debugger 5.5
BCC Developer
を使ってC言語を勉強してるのですが、最近BCC Developerがよくバグります。
プログラムはちゃんと書けてるのに、いざコマンドプロンプトを開くと「問題が発生したため〜〜を終了します。」
と出てきて、そこで終わってしまいます。
こういうのって開発環境を変えた方が良いんでしょうか??

138 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 05:05:52 ]
コマンドプロンプトを開いて何をしたらそのエラーが出る?
コマンドプロンプトを開くだけで出るならBCCは関係ないが。

139 名前:137 [2007/11/11(日) 05:36:06 ]
>>138
レスありがとうございます。
コマンドプロンプト開くだけなら全然大丈夫なんですが
長時間(っていっても2時間とかそんなもん)プログミングしてるとよくエラーになります。
同じプログラムでもちゃんと出力できるときとそうでないときがあっていまいち原因が分からないです。



140 名前:137 [2007/11/11(日) 06:21:33 ]
ごめんなさい。自己解決できました。


141 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 10:01:08 ]
>>136
そのとーり。>>135も指摘しているが、for文の条件判断のところの意味をよく理解しておくこと。

142 名前:デフォルトの名無しさん [2007/11/11(日) 10:03:44 ]
>>121

>入力波形を正弦波にしてサンプリング周波数の 1/(2^n) にしてもそうなる?

はい。純粋に周波数がf,f1,f2...の正弦波をFFTにかけています。
規格化の方も分かってます。


143 名前:86 [2007/11/11(日) 11:13:09 ]
昨日質問した者ですが、やはり足し算などをすると出力がおかしいみたいです。
このようになるのですが間違っている部分ありますか?
www.imgup.org/iup500370.png
宜しくお願いします。

144 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 11:17:49 ]
>>143
printf("%d\n", d); // & いらない

145 名前:86 mailto:sage [2007/11/11(日) 11:21:45 ]
>>144
昨日も同じレスもらってたのに気付きませんでした…。
今やったらできました。「&」でしたか…
ありがとうございました!!

146 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 11:44:53 ]
市ねよ &d

147 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 11:53:20 ]
>>135 >>141
レスありがとうございました.
forの条件判断は,反復の終了条件ではなく,継続条件なのですね.
つまり,その条件が偽になったら終了と.
つまらない質問に答えていただき,ありがとうございました.

148 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 13:19:24 ]
ちょっと質問させてください。3つの数の最大公約数を
求めるプログラムしてたんですが、下記のこれでもいけますかね?
#include<stdio.h>
#include<stdlib.h>
#define n 3
int main(void
{
int kazu[n];
int i=0, c,num;
while(i < n){
printf("入力 %d < ", i+1);
scanf("%d", &kazu[i]);
i++;
}
for(i=1; i< n; i++){
while(kazu[i] != 0){
c = kazu[i];
kazu[i] = kazu[0] % kazu[i];
kazu[0] = c;
}
}
printf("gcd = %d\n",kazu[0]);

return 0;
}

149 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 15:18:26 ]
被って申し訳ありませんが質問させてください

#include <stdio.h>
#define INPUT_CNT 3
int main(void)
{
int num[INPUT_CNT];
int cnt;
for(cnt = 0 ; cnt < INPUT_CNT ; cnt++)
{
printf("Input number%d : ",cnt+1);
scanf("%d",&num[cnt]);
}
printf("(");
for(cnt = 0 ; cnt < INPUT_CNT ; cnt++)
{
printf("%d +",num[cnt]);
}
printf(")");
printf("\n");
return 0;
}
出力結果
Input number : 10
Input number : 20
Input number : 30
(102030)
↑102030の間に+を表示させるにはどうしたら良いですか?



150 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 15:23:40 ]
初歩的な質問ですみません。
printfの変換仕様のフィールド幅の部分をマクロで
置き換えたいんですが、方法はありますでしょうか?
printf("値: %05d\n", number);
を、
define FIELD 5
printf("値: %0FIELDd\n", number);
といった感じに。(↑上手く動作しません。)↓はコンパイルできませんでした。
printf("値: %0"FIELD"d\n", number);

ちなみに、コンパイラはgccです。よろしくおねがいします。

151 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 15:26:59 ]
>>149
僕がやったところ、下記のような出力結果になってますよ。

Input number1 : 10
Input number2 : 20
Input number3 : 30
(10 +20 +30 +)


152 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 15:27:08 ]
>>150
printf("値: %0*d\n", FIELD, number); でいけたかと

153 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 15:29:56 ]
>>152
いけました!
ありがとうございます!!

154 名前:149 mailto:sage [2007/11/11(日) 16:50:50 ]
>>151
あっそうなんです
どうしても+が一つ多くなってしまうんですが
(10 +20 +30)
こういうすっきりした形にしたいんですが・・・

155 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 16:53:28 ]
for(cnt = 0 ; cnt < INPUT_CNT - 1 ; cnt++) printf("%d +",num[cnt]);
printf("%d", num[cnt]);

156 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 16:53:53 ]
for(cnt = 0 ; cnt < INPUT_CNT ; cnt++)
{
if(cnt>0){ printf(" +"); }
printf("%d",num[cnt]);
}
これでいいんじゃない

157 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 17:18:52 ]
おすすめできないが、こういう書き方も。

for(cnt = 0 ; cnt < INPUT_CNT - 1 ; cnt++)
{
printf("%d + ",num[cnt]);
}
printf("%d",num[cnt]);

158 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 17:21:12 ]
ループの中に無駄な分岐突っ込むよりは、はるかにマシだろ。
まぁ、155が見えないバカにはわからないだろうが。

159 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 18:03:37 ]
VC++2005EE の ^Z の問題は結局どうなったの?




160 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 18:09:45 ]
>>154
もっとおすすめできないが、
return文の2行上のprintf文をこうするとか。
printf("\b)");
\bってのはカーソルを1文字戻すエスケープシーケンスね。

161 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:22:26 ]
関数定義で
bool hoge(int array[const])
{
...
}
とやっても良いらしいのだけれど
array[const]ってどういう意味の配列になるの?

162 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:26:19 ]
mainから整数型の配列受け取るだけじゃね?って思ったら受け取る時は普通ポインタ使う品

163 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:52:40 ]
>>161
bool hoge(int * array)と全く同じ。

>>162
何故main限定?w

>>160
お勧め云々以前にダメすぎ。

164 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:03:14 ]
>>163
bool hoge(int * const array)
というわけでもない?

165 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:07:38 ]
67です
遅くなりましたが、レスさんくすです

>>69
VisualStudioは残念ながら所有していません
ExpressEditionで試してみます

>>71
どうもです
面白そうですね
試してみます

その他にも知り合いのJava使いからOpenGrokなるツールを紹介してもらいました
これらを参考に仕事がんばらせていただきます

どうもありがとうございました

166 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:17:56 ]
>>161>>163
int *const arrayと同じ。
C99から導入された書き方。


167 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:28:30 ]
>>166
サンクス。C99からだったか・・。
どうりでわからんわけだ。C99の資料も欲しい。

168 名前:デフォルトの名無しさん [2007/11/11(日) 20:51:19 ]
コボルはデータを読み込んで演算させて吐き出すことが主ですがC言語はどうですか

また、実務で使われている開発環境はVC++ですか、ボーランドのやつですか
エクリプスですか

169 名前:149 mailto:sage [2007/11/11(日) 21:53:42 ]
「-」を入れると出来るんですね
本当にどうもありがとうございました





170 名前:デフォルトの名無しさん [2007/11/11(日) 21:54:20 ]
一時停止させる関数とそのヘッダファイル教えてください

171 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 21:59:29 ]
何を一時停止?


172 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:00:21 ]
>>170
sleep()でググってみそ。

173 名前:デフォルトの名無しさん [2007/11/11(日) 22:00:35 ]
while(){
printf("hoge");
0.5秒待つ ←これを実行するための関数とヘッダファイルです
}


174 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:02:10 ]
putc(' ', NULL); //stdio.h

175 名前:デフォルトの名無しさん [2007/11/11(日) 22:02:45 ]
>>173
システムに依存する。

176 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:04:58 ]
>>173
windows.h
Sleep(500);

177 名前:173 [2007/11/11(日) 22:06:23 ]
ありがとうございます

178 名前:デフォルトの名無しさん [2007/11/11(日) 22:25:26 ]
>>172
ゲイツに聞こうぜ
あんだけ話題になったんだし
matome.info/HatsuneMikuImageSearch/

179 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:46:32 ]
最近初めたばかりなんですが
int double floatについて教えてください。

int型は整数型ということを調べていてよく見たのですが
int a=0.5 や int b=0.00000005 でもエラーが出ません。
また、範囲が狭いということが書いてあったのですが
int a=1234567890 と大きい値を入れても大丈夫でした。
どれくらい大きい値まで大丈夫なのでしょうか。

それと小数点を扱うときはdouble と floatを使うとあったのですが
二つの違いもよくわかりません

お願いします



180 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:50:35 ]
>>179
www.aso.ecei.tohoku.ac.jp/~yoshi/C/double.html

181 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:52:33 ]
そこには普通floatって書いてあるけど、
実際には理由がなければdoubleを使うのが普通。

182 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 22:59:55 ]
>>179
浮動小数点なのでfloat
(↑1.1346*10^5とか)
doubleは倍精度(おもに小数部分が)なので

183 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:05:11 ]
stdio.cとかstring.cってどこにあるの?
*.hは/usr/includeにあるけど本体がどこにあるのかわからない。

184 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:05:58 ]
> 倍精度(おもに小数部分が)

185 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:06:52 ]
>>183
検索しても見つからなかったら、インストールされてないんじゃない?

186 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:07:57 ]
>>185
いやトラブルにあったとかそういうことじゃなくて
ソースを読むために居場所を知りたい。

187 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:22:59 ]
>>179
>int a=0.5 や int b=0.00000005 でもエラーが出ません。

エラーは出ないけど、だまって整数に切り捨てられる。

188 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:26:29 ]
エラー出ないのか
Cでもいつもキャストしてるから気づかなかった

189 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:26:36 ]
>>186
いやだから、ライブラリのソースはインストールしてないと入ってない



190 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:26:48 ]
>>186
標準関数のソースは、OSなりコンパイラをインストールするときに、オプションで指定しないと入らないんじゃないの?

なんでもいいから見たいってことなら、ネットで探せば出てくると思うけど。

191 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:27:56 ]
>>186
そんなものない。
ファイルに書き出すにしても、OSのAPI呼び出したりアセンブラで書いたりと
C言語じゃないことやってるんだから、Cのソースファイルとしては存在しない。

192 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:32:11 ]
>>189
>>190
そうなのか、全然知らなかった。
インストールしないといけないのか。thx!

193 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:38:40 ]
>>179
doubleの方がfloatより精度が高い。

だから計算に時間がかかるかといえばそうでもなくて、
CPUに乗ってる数値演算プロセッサが32bit精度だったり、
C言語のライブラリがdouble前提で作られたりしてて、
floatで計算すると、
float-double変換→計算→double-float変換
となってdoubleよりも遅くなることが多かった。

けど、最近はSSEなどの演算命令などが出てきたため、
floatの方が速い場合もあるらしい。


194 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:42:51 ]
ごめん、ウソついた。
FPUは80bitだから、「CPUに…」の行は無視して。

195 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 23:48:02 ]
179ですが皆さんありがとうございました。
イメージできてきました。

intが8バイトや、256ビットやら、バイトとビットがよくわかってもいない中で
わけがわからなくなっていましたが
精度の違いってこのbitの部分が違うということですよね?

足し算、掛け算やら計算を格納するところはdoubleにしてやるように気をつけます。
ありがとうございました

196 名前:デフォルトの名無しさん [2007/11/12(月) 00:34:47 ]
ランダムに-1.0から1.0までのdouble値を生成するコードを考えてくれたまえ

197 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 00:40:02 ]
(double)rand() / RAND_MAX * 2 - 1

198 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 00:43:52 ]
char *ptr = "ghijkl";
が可能で

char *ptr;
scanf("%s",ptr);
がダメなのはなんで?

199 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 00:46:55 ]
>>198
char *ptr = "ghijkl";
は、コンパイラがどっかに用意した"ghijkl"って領域の
先頭アドレスをptrに代入してる。だからOK

char *ptr;
はptrってポインタ(アドレスを入れる箱)は用意したけど、まだ中身は不定。
文字列を入れる場所が確保されてないから、コピーできない。



200 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 00:47:28 ]
そのポインタは確保された領域を指していないから

201 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 00:50:22 ]
char *ptr;
scanf("%s",ptr);
を可能にするにはmallocやnewやらで領域作らないとダメなの?

それだと
char ptr[256];
scanf("%s",ptr);
でやってしまっても問題ないなぁ…

なんか領域が可変な1次元のcharでもあればいいのに






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<195KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef