トップページ⇒tech
1001コメント324KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/05/16(水) 16:53:13
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

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

過去スレ
Part 1 ttp://pc8.2ch.net/test/read.cgi/tech/1146700389/ Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/ Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/ Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/ Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/
Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/ Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/
Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/
0002デフォルトの名無しさん2007/05/16(水) 16:55:31
関連スレ
C/C++の宿題を片付けます 86代目
http://pc11.2ch.net/test/read.cgi/tech/1165718021/
くだすれC言語(初心者用) Part.2
http://pc11.2ch.net/test/read.cgi/tech/1172099763/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
はきだめC/C++下級者の質問箱 2
http://pc11.2ch.net/test/read.cgi/tech/1156206091/

関連リンク
C 関数検索 man on WWW
http://www.linux.or.jp/JM/
初心者のためのポイント学習C言語
http://www9.plala.or.jp/sgwr-t/
WikibooksのC言語の教科書
http://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E
0003デフォルトの名無しさん2007/05/16(水) 17:15:04
だから要らんと言ってるのに。
0004デフォルトの名無しさん2007/05/17(木) 00:39:44
質問お願いします。
scanfを使って2つの変数を入力したいんですが、
sanf("%d",&a,b);
こんな感じで良いのでしょうか?動作環境がないため確認お願いします。
0005デフォルトの名無しさん2007/05/17(木) 00:40:45
>>4
sanf("%d %d",&a,&b);
0006デフォルトの名無しさん2007/05/17(木) 00:41:32
コピペしたら失敗した

>>4
scanf("%d %d",&a,&b);
0007デフォルトの名無しさん2007/05/17(木) 00:43:05
>>5
早速の回答ありがとうございました。
0008デフォルトの名無しさん2007/05/17(木) 01:41:51
二次元配列の引渡しはどうしたら良いですか?
main関数の中で宣言した int a[3][3]をほかに自分で宣言、定義した関数に渡すときとか。
0009デフォルトの名無しさん2007/05/17(木) 01:50:38
そのままaを渡せばいい
引数の宣言は int a[][3] でいいかな
0010デフォルトの名無しさん2007/05/17(木) 02:04:14
>>9
回答、ありがとうございました
0011デフォルトの名無しさん2007/05/17(木) 15:53:01
newで確保した領域を中身を消すことなく再割り当てってできますか?
0012デフォルトの名無しさん2007/05/17(木) 15:56:26
>>11
cにはnewなんてありません。
0013デフォルトの名無しさん2007/05/17(木) 16:17:42
入力した文章中の単語を1行に一つずつ印字するプログラムを書け。
(ここでの単語とは、ブランク,タブ,改行文字で区切られた文字)
例えば、
This is a book.
と入力すると、
This
is
a
book.
と表示される。

while((c=getchar()) != EOF)
という文を使って文章を入力するらしいのですが、どうやって表示させればいいのかわかりません。
教えてください。
0014デフォルトの名無しさん2007/05/17(木) 16:20:01
いやです。
0015132007/05/17(木) 16:21:45
そうですか。
すみませんでした。
0016デフォルトの名無しさん2007/05/17(木) 17:34:16
printf
0017デフォルトの名無しさん2007/05/17(木) 17:50:57
>13
while((c=getchar())!=EOF) {
putchar(c);
if(c==' '||c=='\t'||c=='\n') putchar('\n');
}
0018デフォルトの名無しさん2007/05/17(木) 19:04:11
>>17
改行セパレータの時に二重改行しちゃうかららめぇ。
if(c==' '||c=='\t'||c=='\n') putchar('\n'); else putchar(c);
0019132007/05/17(木) 20:03:29
>>18
これだと、Enterを押したときに表示されませんか?
理想としては、while文が終わった後に、まとめて表示させたいのですが。
0020デフォルトの名無しさん2007/05/17(木) 20:13:17
>>3
こうやってスレの使い分けも出来ない莫迦が存在する限り、このスレは必要なんですよ。
0021デフォルトの名無しさん2007/05/17(木) 20:15:55
>>19
それは>13に書かれた要件を超えた要求だな。
そもそも○投げなら宿題スレにいけ。
0022132007/05/17(木) 20:19:04
>>21
宿題スレってものがあったんですね
本当にすみませんでした
0023デフォルトの名無しさん2007/05/17(木) 20:21:36
>>22
スレの先頭くらい見ような。

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

>前スレ
>C言語なら俺に聞け(入門篇) Part 12
>http://pc11.2ch.net/test/read.cgi/tech/1178620766/
>
>過去スレ
>Part 1 ttp://pc8.2ch.net/test/read.cgi/tech/1146700389/ Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/
>Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/ Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/
>Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/ Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/
>Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/ Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/
>Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/ Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/
>Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/
>
>2 名前:デフォルトの名無しさん[] 投稿日:2007/05/16(水) 16:55:31
>関連スレ
>C/C++の宿題を片付けます 86代目
>http://pc11.2ch.net/test/read.cgi/tech/1165718021/
>くだすれC言語(初心者用) Part.2
>http://pc11.2ch.net/test/read.cgi/tech/1172099763/
>スレを勃てるまでもないC/C++の質問はここで 2
>http://pc11.2ch.net/test/read.cgi/tech/1178503366/
>はきだめC/C++下級者の質問箱 2
>http://pc11.2ch.net/test/read.cgi/tech/1156206091/
0024デフォルトの名無しさん2007/05/17(木) 20:21:47
>>20
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
http://pc11.2ch.net/test/read.cgi/tech/1170338926/

くだすれC言語(初心者用) Part.2
http://pc11.2ch.net/test/read.cgi/tech/1172099763/

【初心者歓迎】C/C++室 Ver.34【環境依存OK】
http://pc10.2ch.net/test/read.cgi/tech/1169039760/
0025デフォルトの名無しさん2007/05/17(木) 21:18:06
gccで作成したa.outをexeにしたいのですがどうすればいいのでしょうか?
0026デフォルトの名無しさん2007/05/17(木) 21:26:28
>>25
ttp://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_2.html
-o file
0027252007/05/17(木) 23:01:48
>>26
有難う御座いました。
0028sage2007/05/18(金) 03:12:47
文字列配列をstrcmp関数を使って、
辞書順にクイックソートするアルゴリズムを作ったのですが、
並び替えた結果を見ると、ところどころ並び替えを間違えています。
原因がまったくわかりません。どのように直せばいいのでしょうか?
line[]が文字列の入っている配列です。

void Swap(int i, int j)   //交換する
{a = line[i];
line[i] = line[j];
line[j] = a; }

void QSort(int left, int right)
{ int i,j,middle;
i = left;    /* ソートする配列の一番小さい要素の添字 */
    j = right;    /* ソートする配列の一番大きい要素の添字 */
  middle = (left + right) / 2;   /* 基準値を配列の中央付近にとる */
while (1) {
   while (strcmp(line[i],line[middle])<0) /* 基準より辞書順に後ろにある文字列が */
i++; /* 出るまで i を増加させる */
while (strcmp(line[j],line[middle])>0) /* 基準より辞書順に前にある文字列が */
j--; /* 出るまで j を減少させる */
if (i >= j) break; /* i >= j なら無限ループから抜ける */
Swap(i, j); /* line[i] と line[j]を交換 */

if ((middle -left) > 0) /* 基準値の左に 2 以上要素があれば */
QSort(left, middle-1); /* 左の配列を クイックソートする */
if ((right - middle)> 0) /* 基準値の右に 2 以上要素があれば */
QSort(middle+1, right); /* 右の配列を クイックソートする */
}
0029デフォルトの名無しさん2007/05/18(金) 04:15:50
strcmp(line[i],line[middle])<0
を
line[i]-line[middle]<0

にしてみたら?その下も同じ。

strcmpは文字列を比較する関数であって、
1文字をあらわすline[i]の比較には使えない。
0030デフォルトの名無しさん2007/05/18(金) 05:12:33
>>28
line[middle]と同じ値は左右どっちに移動すると思う?

>>29
そんなミスだったらコンパイル通らないでしょ。
0031302007/05/18(金) 05:27:53
> line[middle]と同じ値は左右どっちに移動すると思う?

これはちょっと言葉が足りなかった、すまん。
1, 2, 50, 1, 1
こんな例で考えてみればわかるかな。
0032デフォルトの名無しさん2007/05/18(金) 06:33:22
C言語で、C#でArrayListに構造体を突っ込んだような可変長の構造体を扱いたいのですが
どういう風に組むのがいいでしょうか?
0033デフォルトの名無しさん2007/05/18(金) 06:42:16
>>32
C++でvectorを使う
0034デフォルトの名無しさん2007/05/18(金) 06:54:25
>>32
malloc() realloc() free() などを使うといいと思うよ
0035デフォルトの名無しさん2007/05/18(金) 10:46:41
関数を呼び出す時(環境はWinXP,VC++)はリニアアドレスで指定しているのか
セレクタ値とオフセットアドレスで指定しているのかを知りたいですが、

#include <stdio.h>
void foo(void){};
int main(void)
{
void (*hoge)()=foo;
printf("hoge of address is %p\n",hoge);
return 0;
}

これを実行したら
hoge of address is 00401000
と表示されました。
この上位16ビット(0040h)はセレクタ値で、下位16ビット(1000h)がオフセットアドレスですか?
0036デフォルトの名無しさん2007/05/18(金) 11:11:57
仮想メモリ上でのリニアなオフセットです
0037デフォルトの名無しさん2007/05/18(金) 11:33:49
セレクタとオフセットって、いつの時代の人だ…
0038デフォルトの名無しさん2007/05/18(金) 11:53:15
なつかしいなおいw
0039352007/05/18(金) 12:16:52
あれ、今はじめて読む486って言う本で勉強してるんですが、最近ではセグメントの管理の仕方ってまた変わってるんですか?
その本ではリアルモードの時に関数へのfarポインタにセレクタ値16ビットと関数のオフセットアドレスをくっ付けたものを代入して
プロテクトモードに移行してからそのポインタを参照してました
0040デフォルトの名無しさん2007/05/18(金) 12:30:50
>>39
>環境はWinXP
これでかなーり事情が変わるので Advanced Windows でも嫁となる
0041デフォルトの名無しさん2007/05/18(金) 12:57:06
>>39
OSのブート部分を書くのでない限り、セグメントのことは忘れてあげて
ください。

0042352007/05/18(金) 16:22:25
>>40,41
あ、9x系まではそうだったからいつの時代だよってことですか…了解です
0043デフォルトの名無しさん2007/05/18(金) 16:52:24
>>39
はじめて読む486だったら、もっと後のページで32ビットアドレスの話が出てくるはず。
これはようするにオフセットが32ビットになっているモード。
Win32アプリケーションは、その32ビットアドレスのモードで動く。
35のコードで出力された32ビットのアドレスも全てオフセット値。

ちなみに、Win16アプリケーションなら16ビットセレクタと16ビットオフセットを使う。
0044デフォルトの名無しさん2007/05/18(金) 18:25:45
入力はfgetsを使えとよく言われていますが、
fgetsは読み込んだ文字列がバッファに入りきったかどうか判別できませんよね?

改行で読み終わった場合は、バッファに改行コードがあるかどうかで読みきれたかどうか
判別できます。しかしEOFで読み終わった場合はそれが判別できないと思うのですが。

入力→バッファがあふれたらstdinをクリアして再入力

という処理を確実に行うにはどうすればいいのでしょうか。
0045352007/05/18(金) 18:48:21
>>43
ありがとうございます、もう少し読み進めてみます
0046デフォルトの名無しさん2007/05/18(金) 18:55:50
>>44
>EOFで読み終わった場合はそれが判別できないと思うのですが。
char buf[1000];
fgets(buf,1000,stream);
だとして
文字数のチェックして999未満ならEOF、または改行で終了した
そして最後に改行文字がなければEOFって判断できるんじゃない?
0047デフォルトの名無しさん2007/05/18(金) 18:59:19
fgetsは改行認識しないだろ。
0048デフォルトの名無しさん2007/05/18(金) 19:01:07
BCBのヘルプ
fgets は,stream から文字を読み込んで文字列 s に格納します。読み込みは n-1 個の文字を読み込むか,または改行文字を読み込んだときに終了します。
改行文字で終了した場合には fgets は,s の最後に改行文字を格納します。
s に読み込まれた文字の最後にはヌルターミネータが付加されます。
0049デフォルトの名無しさん2007/05/18(金) 19:02:42
>>44
>EOFで読み終わった場合は
読み込み中にファイルの終わりに達したら
そこまでのデータが読み込まれる。
↓
更に読もうとしたら NULL が返るし、feof() を呼べば 0 以外が返る。

>バッファがあふれたらstdinをクリアして再入力
バッファを拡張して続きを読めばいいでないの。

>>47
fread() と間違えてる?
0050デフォルトの名無しさん2007/05/18(金) 19:09:30
>更に読もうとしたら NULL が返るし
バッファぴったりに読んだ場合、更に読もうとしたら入力待ちにならない?
0051デフォルトの名無しさん2007/05/18(金) 19:14:57
追記可能なストリームならそうなるな。
0052デフォルトの名無しさん2007/05/18(金) 19:17:10
>>48,49
思いっきりボケてたわスマン
恥ずかしい・・・
0053デフォルトの名無しさん2007/05/18(金) 19:24:36
>>50
ごめん、俺よくわかってない、入力待ちって?
>バッファぴったりに読んだ場合
char buf[10];
fgets(buf,10,stream);
として9文字の入力を読み込んだときってこと、それとも10文字?
0054デフォルトの名無しさん2007/05/18(金) 19:26:25
キーボードバッファが空の状態でfgets呼んだら入力待ちになる、ってことじゃね?
0055デフォルトの名無しさん2007/05/18(金) 19:45:42
まあ普通は改行入れるし、Ctrl-Dは入力してないときに入れるもんだから影響ないか
0056デフォルトの名無しさん2007/05/18(金) 19:49:05
>>54
そういうこなのかな
stdinから読み込んでバッファが空になったら入力待ちになるのは当然な気が・・・
それでも問題にはならないと思うけど
こんなコードでも問題なく動作するし
#include <stdio>
int main()
{
FILE *in;
char buf[5];
while(fgets(buf,5,stdin)!=0)
{
printf("%s ",buf);
}
return 0;
}
0057デフォルトの名無しさん2007/05/18(金) 19:49:46
FILE *in; は消し忘れでした
0058デフォルトの名無しさん2007/05/18(金) 19:59:43
1回の入力(待ち)で確実に全入力を取得したいってことだよ
2回目の入力待ちは避けたい場合ね。
0059デフォルトの名無しさん2007/05/18(金) 20:00:30
>>56
改行含めて4文字以下のときにアウトだろ
0060デフォルトの名無しさん2007/05/18(金) 20:03:39
>>58
そういうことか

>>59
>>58って事ならアウトだね、確かに
0061442007/05/18(金) 20:33:05
質問の内容が具体的でなかったようで、申し訳ありません。
安全な入力を実現するにはどうすればいいかを考えており、
検証するためにテストプログラムを作っています。

http://www.uploda.net/cgi/uploader4/index.php?file_id=0000013415.c

このプログラムで、改行で読み終える場合はバッファオーバーフローの
危険を回避することが出来たのですが、EOFで入力を終了した場合の
対応策を考えられなかったので、このような質問をしました。
0062442007/05/18(金) 22:05:46
>>61で「バッファオーバーフロー」という言葉を使いましたが、
適切ではありませんね。すみません。

バッファサイズを超える入力を受けたとき、環境に依存しない方法で
stdinをクリアし、再入力を促す。ということです。
0063デフォルトの名無しさん2007/05/18(金) 22:15:50
>>62
ソース見ていいたい事分かった・・・気がする
極力元ソース変えないようにしたけどこれではダメ?
#include <stdio.h>
#include <string.h>
int main(void)
{
int num = 0;
char c,buf[5];
for (;;) {
printf("整数を入力してください : ");
fgets(buf, sizeof(buf), stdin);
/* バッファサイズをオーバーした場合、stdinをクリアし、再入力 */
if (strchr(buf, '\n') == NULL) {
scanf("%*[^\n]%*c");
/* 正常に読み取れた場合 */
} else {
if (sscanf(buf, "%d", &num) != EOF) {
break;
}
}
fprintf(stderr, "入力でエラーが発生しました\n再入力してください\n");
}
printf("num = %d\n", num);
return 0;
}
0064632007/05/18(金) 22:19:24
>>62
if (strchr(buf, '\n') == NULL) {
scanf("%*[^\n]%*c");
}
fgetsでbuf に取り込んだ文字列内に'\n'がない場合は
scanf("%*[^\n]%*c"); によって入力バッファの以降の文字をスキップする
正確には %*[^\n] で'\n'の一つ前までをスキップして %*c で'\n'そのものをスキップする
でバッファ内には残らなくなる・・・的な・・・
0065442007/05/19(土) 10:27:49
>>63
stdinの読み捨ては簡単にすることが出来ましたが、EOFで読み終わったとき
無限ループにはまってしまいます。
0066632007/05/19(土) 18:39:31
>>65
EOF入力でも再入力を求めたほうがいいの?
それともEOFが入力されたら終了していい?
0067442007/05/19(土) 19:49:47
>>66
可能なら再入力を求めるほうがいいですね。
0068632007/05/19(土) 20:06:13
そか
scanf("%*[^\n]%*c"); を rewind(stdin); に変えると環境によってはうまくいくんだけど
MS的にはおkとしている
でも他の環境だと・・・
環境依存なものはダメだよね?
0069デフォルトの名無しさん2007/05/19(土) 20:18:49
ちょっと待て。EOFってことは標準入力がクローズされていると思うんだが。
0070442007/05/19(土) 20:26:58
>>68
環境依存OKだとその方法で出来てしまうんですよね…。

if (feof(stdin)) {
/* エラー処理 */
exit(1);
}

このへんで妥協するしかないですかね。
どうやらfgetsはEOFで読み終わった場合はstdinにEOFが残された状態になるらしく、
再入力を求める場合、どうしても無限ループになってしまいます。
0071632007/05/19(土) 20:41:25
>>69
そうなの?
ファイルの終端に達したからといってクローズされるとは思わないけど
それとも勝手に閉じられてしまうの?

>>70
って事は環境依存はダメって事ね
0072442007/05/19(土) 20:51:11
>>71
>って事は環境依存はダメって事ね
そうですね。お手数かけてすみません…。
0073デフォルトの名無しさん2007/05/19(土) 22:01:13
clearerr(stdin)ってどうだろう?
0074632007/05/19(土) 22:06:10
>>73
ダメ
実証もしたよ
0075デフォルトの名無しさん2007/05/20(日) 00:26:01
線形代数の勉強中で、プログラムを使って行列式を計算するプログラムを作ろうと思いました。
しかし行列をtempという作業用行列に渡す時にエラーが出ます。

http://www.uploda.org/uporg815439.c.html

環境はgcc3.3.6

どこがいけないのでしょうか。教えてください。
ちなみにベクトルの代入は成功してるようです。
0076デフォルトの名無しさん2007/05/20(日) 00:44:28
>>75
多次元配列(厳密にはただの配列と一緒なんだが・・・)を仮引数とするときは
最初(最後だったかもしれん)の1つ以外は指定しなければならないという制限があったはず
そうしないとコンパイラがポインタ値をいくつスライドさせりゃいいのか分からんからな
0077デフォルトの名無しさん2007/05/20(日) 00:54:00
完成プログラム(?)です。
http://www.uploda.org/uporg815517.c.html
一応行列式は算出してくれます。
でもこれだと100次元にするときはいちいち3を100に書き換える必要がある。
これじゃ次元をint nで渡してる意味がない。
せめて[][2]を[][n]という形でかけるといいのですが、やりかたはないでしょうか?
0078632007/05/20(日) 01:00:21
>>75
関数宣言で
int a_substitute(int a[][])
としているでしょ
関数に配列を渡すときには”配列”としてではなく”ポインタ”として渡される
引数に配列が使えるのはコンパイラ段階で引数が分かっていることが前提
ところがコンパイラ上で渡された配列のサイズが不明なためコンパイルできない

int a_substitute(int a[][2]) とすればコンパイルは通る
と計算といってるけど、これからその部分書くの?
0079632007/05/20(日) 01:01:59
>>77
#define N 100

int a_substitute(int a[][N])

とかはダメ?
0080デフォルトの名無しさん2007/05/20(日) 01:02:26
>>78
プログラムうp遅れすまそ。
上にうpしたやつです。名前はmatrix.cといいます。
しかしこれでは希望の仕様を満たさない。
どうすればいいのやら・・・これが出来たら次は外積のプログラムを作りたいのですが。
これでは応用が効かない。
0081デフォルトの名無しさん2007/05/20(日) 01:02:28
>>77
手持ちのC99仕様書によるとこういう宣言も認められるらしいが使ったことないので分からん
試してみてくれ

T foo(int n, int m, T' a[n][m]);
0082デフォルトの名無しさん2007/05/20(日) 01:03:53
>>79
main関数内で行列なりベクトルなりの次元を取得して
それを引数にするためプリプロセッサでは無理ですね。
それでは書き換えるのと大差ない。
0083デフォルトの名無しさん2007/05/20(日) 01:04:45
>>81
ど、どういう意味ですかその宣言方法は。
なんか光明が
0084デフォルトの名無しさん2007/05/20(日) 01:07:58
double det(double *a, int n){
double *temp;
//中略
temp = (double*)malloc(sizeof(double)*n*n);
for(i=0; i<n; i++) for(j=0; j<n; j++) temp(i*n+j) = a(i*n+j)
//後略
ってやるのはどう?
関数に渡すときにキャストして。
0085デフォルトの名無しさん2007/05/20(日) 01:10:07
>>83
おそらくC99で追加された可変長配列(配列宣言時にConstantでなくVariableを大きさとして指定できる配列)を
仮引数並びに使ってるんだろうが詳しくは知らん
gcc3.3.6ならC99対応してるだろうからおそらく通るとは思うが通らない可能性も否定できん
0086デフォルトの名無しさん2007/05/20(日) 01:13:47
#include <stdio.h>

main () {
    char text;
    
    printf ("Please Input Key : ");
    text = getchar ();
    
    printf ("Input key is %c.",text);
    
    if (text != 'z') {
        printf ("\nPlease Input Key : ");
        text = getchar ();
    
        switch (text) {
            case 'Y':
            case 'y':
                printf ("Y");
0087デフォルトの名無しさん2007/05/20(日) 01:14:50
            break;
            
            case 'N':
            case 'n':
                printf ("N");
                        
            break;
            
        default:
        printf ("$");
        }
    }
    
    return 0;
    }
0088632007/05/20(日) 01:15:53
>>82
実行段階でのサイズを変更をしたいのね

>>84
double det(double **a, int n){
じゃないかと・・・
0089デフォルトの名無しさん2007/05/20(日) 01:16:21
おっ!!!
なんとなくやってみたら出来たっ!!
(a[][n], int n) => (int n, a[][n])
と後ろに置けばおkみたいですね。もちろんa[n][n]でもおk(まぁ無駄だけど)

感動・・・

完成プログラムを置いておきます。
http://www.uploda.org/uporg815567.c.html

a[0][n]がいいかa[n][n]がいいか。どちらがベストかは微妙です。
0090デフォルトの名無しさん2007/05/20(日) 01:19:00
>88
配列わかってねー
0091デフォルトの名無しさん2007/05/20(日) 01:19:18
>>86-87が失敗ソースなのですが

メッセージを出し、キーを入力させ
入力したキーを表示させます

もし入力されたキーがzなら終了
z以外なら再入力を促し
YないしyならYを表示→終了
NないしnならNを表示→終了
それ以外なら$を表示→終了

としたいのですが、どうも再入力を受け付けてくれません
この場合、変数を増やしてやるほかに方法は無いのでしょうか?
rewind (stdin);を入れてやれば、一応は解決したのですが
こうするとバッファデータが全部ロストするみたいなので、余り良くないんじゃないかなぁ・・・と

それとrewind (stdin);を入れて、再入力した場合
何を入れても$が表示されてします
復改というのでしょうか?
\nが混じるのが問題みたいなんですが
これを除去する良い方法はないのでしょうか?
0092デフォルトの名無しさん2007/05/20(日) 01:19:52
>>84
むつかしい。理解不能でつ
キャストとかポインタが連発するともう解析不可能・・・
0093632007/05/20(日) 01:22:23
>>90
ごめん、勘違いした
0094デフォルトの名無しさん2007/05/20(日) 01:22:24
>>84
その方法だと、配列が小さいときは良いが、でかくなったときにオーバーヘッドが大きすぎないか?
0095デフォルトの名無しさん2007/05/20(日) 01:22:52
>>91
訂正
”それとrewind〜方法はないのでしょうか?”は無視してくださってかまいません

ですが、改行を読み飛ばす方法は教えてくださると幸いです
調べたらgetchar ();をダブらせるといいとか、fgetsで関数を組むみたいなことを見つけたのですが
いかんせん上手くいきません・・・
0096デフォルトの名無しさん2007/05/20(日) 01:23:40
つーか84は
*temp(i*n+j) = *a(i*n+j)
だろ
0097デフォルトの名無しさん2007/05/20(日) 01:24:02
>>95
現在stdinにある文字を改行含めて読み飛ばすならこれでいける
scanf("%*[^\n]%*c");
0098デフォルトの名無しさん2007/05/20(日) 01:27:38
>96
なんか混ざってるw
p[i*n+j]もしくは*(p+i*n+j)が正解
0099デフォルトの名無しさん2007/05/20(日) 01:45:40
>>94
固定長の配列版と較べて、遜色ない速度にまで最適化されるから心配なし。
つーか、激しく常套手段。ついでに、i * n + jの部分を別関数にしても問題なし。
Ex. size_t offset(unsigned, i, unsigned j, size_t n) {return i * n + j;} ... temp[offset(i, j, n)] = a[offset(i, j, n)];
0100デフォルトの名無しさん2007/05/20(日) 01:48:51
>>97
>>86-87の派生版に
それを組み込んでみたんですが、上手く動作しません

原因は大体解ってるんですが、やり方がわからないんですよね・・・

ソース
http://www.borujoa.org/upload/source/upload11705.c

scanf("%*[^\n]%*c");の組み込み位置が可笑しいのは解ってるんですが
(一応、前のtextに引っ掛けてるつもりです)
全部読み飛ばすと判定が出来なくなるというか、入力する意味が失われますので
getcharで読み飛ばしを試みてるのですが、どうしても読み飛ばされないです

どうすればswitchの判定を有効に出来るのでしょうか?
(printfで確認した限りでは、defaultしか動いてない)
0101デフォルトの名無しさん2007/05/20(日) 02:06:38
どうでもいいけど激しく読みにくいインデントスタイルだな。

処で、switchがまともに動かない直接原因ではないが、getchar()の戻り値はintで受けるべき。
で、EOFが帰ってきたらその処理もした方がよさそうだが。
■ このスレッドは過去ログ倉庫に格納されています