C言語なら俺に聞け( ..
892:デフォルトの名無しさん
07/11/04 00:18:27
scanf指摘されたところ直ってないじゃん
893:デフォルトの名無しさん
07/11/04 00:20:18
>>891
%sを%cに置換してこい。printf("%s",letter[i]);文字コードがポインタだと解釈されてしまう
894:デフォルトの名無しさん
07/11/04 00:20:29
returnの位置
895:デフォルトの名無しさん
07/11/04 00:22:40
>>892
>>893
ありがとうございます。
>>894
何か場所おかしいですか?
896:デフォルトの名無しさん
07/11/04 00:23:01
>>892
直す前のを載せたんじゃないの?
>>891
printf("%s",letter[i]);
↓
printf("%c",letter[i]);
897:デフォルトの名無しさん
07/11/04 00:23:21
バッファオーバーラン
898:デフォルトの名無しさん
07/11/04 00:26:45
>>897
899:デフォルトの名無しさん
07/11/04 00:32:21
みなさんありがとうございます。
おかげでなんとかできました。
1つ気になるのですが"%c"と" %c"の違いはなんですか?
900:デフォルトの名無しさん
07/11/04 01:04:58
>>899
%cと%sの違いなら、
・scanfの場合
%cなら、引数として渡されたアドレスの指し示す先に、標準入力からとってきた一文字を入れる
%sなら、引数として渡されたアドレスの指し示す先を配列の頭と見て、文字列を入れていく。最後に\0を付加
・printfの場合
%cなら、引数として渡された数値に対応した一文字を標準出力に出力
%sなら、引数として渡されたアドレスを配列の頭と見て、その指し示す先を\0にぶち当たるまで出力する
901:デフォルトの名無しさん
07/11/04 01:10:39
' '
902:デフォルトの名無しさん
07/11/04 01:22:51
>>900
ありがとうございます。
よくわかりました!
903:デフォルトの名無しさん
07/11/04 10:02:07
ところで、何が出来れば入門を卒業したことになるの?
904:デフォルトの名無しさん
07/11/04 10:25:43
言語の文法マスターしたぜ!もう学ぶことねぇwwww
↓
え・・ポインタのポインタ?関数ポインタ?どうだったっけ?
↓
まだまだだな俺 ←この辺から入門卒業
905:デフォルトの名無しさん
07/11/04 11:07:39
>>904
それ面白いなw
初心者に教えてるつもりが逆に初心者から教わってることに気付いたあたりも入門卒業っぽいぜ。
もう一歩踏み込む気構えが出来た頃合がそうなのかもね。
906:デフォルトの名無しさん
07/11/04 11:37:37
>>904
俺的にはそこで、宣言の問題だと気がついたら卒業としたい。
907:デフォルトの名無しさん
07/11/04 11:44:38
「このスレ卒業テスト」と称して課題を出せばいいんじゃね?
908:デフォルトの名無しさん
07/11/04 12:29:28
CでGUIアプリを作れたら入門者卒業
909:デフォルトの名無しさん
07/11/04 12:42:34
>>908
んなわけあるか
910:デフォルトの名無しさん
07/11/04 12:57:44
>>908
コピペで終わりじゃねーかw
911:デフォルトの名無しさん
07/11/04 14:17:19
ポインタが理解できたら入門者卒業
912:デフォルトの名無しさん
07/11/04 14:24:09
ポインタも
*****pくらいついたらわけがわかりません。
const ***p
***const p
とかなったらわかりません
関数ポインタなんて使ったことありません。なんで使うんですか。
GUIなんて作ったことなんてありません
でも入門卒業したいです><
913:デフォルトの名無しさん
07/11/04 14:57:08
関数ポインタの使い道が分からないなら卒業は無理だな
914:デフォルトの名無しさん
07/11/04 15:13:41
関数ポインタは便利だけど、あまり使うことはないですよ。
私は、DLLを使うときくらいですかね。
915:デフォルトの名無しさん
07/11/04 15:17:29
卒業せんでも中退すれば
916:デフォルトの名無しさん
07/11/04 15:37:45
typedef struct
{
char *str;
int (*myfunc)();
} object;
int main()
{
object obj;
obj->str = malloc(sizeof(char) * 256);
fgets(obj->str, 256, stdin);
obj->myfunc();
puts(obj->str);
free(obj->str);
return 0;
}
int myfunc()
{
〜
}
917:915
07/11/04 15:38:59
>>916
×object obj;
○object *obj;
918:デフォルトの名無しさん
07/11/04 16:23:53
>>916
え、そんなやり方でmyfuncを呼び出せるの?
いつ関数ポインタをセットした?
919:916
07/11/04 16:28:35
>>918
あー忘れてた。
obj->myfunc();
の前に、
obj->myfunc = myfunc;
が必要だった。あかんね。
920:デフォルトの名無しさん
07/11/04 16:54:01
#include <stdio.h>
int main(void)
{
int c;
c = getchar();
printf("%d\n", c);
c = getchar();
printf("%d\n", c);
return 0;
}
このプログラムをBCC5.5.1でコンパイルして実行し、"a"と"Ctrl+Z"を1度に入力した場合、
D:\c\my\test2>test2.exe
a^Z
97
-1
このような結果になりました。
ところが、VC++2005EEのcl.exeでコンパイルし、同じように実行すると、
D:\c\my\test2>test2.exe
a^Z
97
26
このような結果になります。なぜVC++20005では正しい結果が得られないのでしょうか。
921:デフォルトの名無しさん
07/11/04 16:59:04
fflush(stdout);
これを main の return の前に。
922:デフォルトの名無しさん
07/11/04 17:06:20
*p (*p)
の違いがわかりません><
923:デフォルトの名無しさん
07/11/04 17:07:39
あっそ
924:デフォルトの名無しさん
07/11/04 17:08:00
教えてください><
925:デフォルトの名無しさん
07/11/04 17:10:33
>>920
stdinの初期設定が違うんじゃね?
^C が受けられるかどうかの設定もできるし。
あるいは ^D とか。
926:デフォルトの名無しさん
07/11/04 17:10:56
>>922
1+2 と (1+2) の違いを考えてみるといいよ
927:デフォルトの名無しさん
07/11/04 17:17:19
>>926
ありあとやんしたー
928:デフォルトの名無しさん
07/11/04 17:44:16
>>920
コレってマジ?
なんで今更こんなバグが残ってんの?
929:デフォルトの名無しさん
07/11/04 17:52:38
>>921
そのようにしても結果は変わりませんでした。
>>925
どうやって設定すればいいのでしょうか?
930:デフォルトの名無しさん
07/11/04 19:11:13
>>928
うちでも確認できた。これはひどいな。
931:デフォルトの名無しさん
07/11/04 19:22:15
そこは仕様では決められてない部分だから、
バグだとか、どっちが間違ってるとかでは無いんじゃね?
932:デフォルトの名無しさん
07/11/04 19:55:34
>>931
でも、stdio.hでは#define EOF (-1)となっているし、^Zだけならちゃんと-1と表示される。
933:デフォルトの名無しさん
07/11/04 20:55:14
そうじゃなくて EOF の前に一応 ^Z も発行するかどうか。
934:デフォルトの名無しさん
07/11/04 21:57:55
>>921
プログラム終了時に、標準入出力もふくめてファイルは全部フラッシュ&クローズされるから、
それは意味ない。
935:デフォルトの名無しさん
07/11/04 22:20:44
num[4][5]={
{0,1,2,3,4},
{5,6,7,8,9},
{10,11,12,13,14},
{15,16,17,18,19}
};
関数に配列の{5,6,7,8,9},とかを1行だけ送りたいのですが
どういう風にやればいいのでしょう?
936:デフォルトの名無しさん
07/11/04 22:41:03
送るだけならnum[1]とかを渡すだけ。
937:デフォルトの名無しさん
07/11/04 22:59:13
EOFについて。
MSのドキュメント調べたけど、記述が見つからなかったので仮説。
てゆーか、コマンドプロンプトの制御文字に関する仕様のドキュメントてどこさ?
行頭にある^Zはコマンドプロンプトが解釈してプログラムに「データ無し」を通知する。
行中にある^Zは文字「0x1A」をプログラムに通知する。
という理由で>>932な動きをするっぽい。
ここはコマンドプロンプトの仕様だと思うんだけど、文献ミツカンネ。
stdinをバイナリモードで開くと同じ挙動をするので、
テキストモードでのデータ中の0x1A(制御コードのEOF)の扱いの差のようだ。
バグというよりは仕様の範疇っぽいね。
0x1Aを含むファイルをテキストモードでオープンして読んでみれば
もうちょい分かりそうなんだけど、データ作るのめんどかったんで誰か頼む。
○ バイナリで開き直したサンプル
#include <stdio.h>
int main()
{
int c;
freopen("CON", "rb", stdin);
do{
printf("%d\n",c = getc(stdin));
}while(c != EOF);
return 0;
}
938:デフォルトの名無しさん
07/11/04 23:10:31
>>936
受け取る方を1次元にしてやれば、まとめて受け取られるんですね。
できました!ありがとうございました!
939:デフォルトの名無しさん
07/11/04 23:18:03
>>937
VC++2005でもファイル中の0x1Aは、getcで読んだらEOFが返ってきた。
やっぱバグじゃねーの?
940:デフォルトの名無しさん
07/11/04 23:24:30
Turbo Explorer
無償のアプリケーション開発環境
URLリンク(www.forest.impress.co.jp)
941:デフォルトの名無しさん
07/11/04 23:27:37
むぅ…すんません
今度は
num[4][5]={
{0,1,2,3,4},
{5,6,7,8,9},
{10,11,12,13,14},
{15,16,17,18,19}
};
の 0 5 10 15 の縦の列の総和を出したいだけなんですが
これも丸々関数に送りたいのです。。。
1次元配列にいっそのこと退避させたほうがいいんでしょうか
942:デフォルトの名無しさん
07/11/04 23:36:02
numごと渡して計算せよ
943:デフォルトの名無しさん
07/11/04 23:42:07
numがココでは小さいんですが
1000×1000と大きい場合を想定しています。
numごと渡したら、メモリがムダに消費されるとかポインタの解説ページとかで見た気がして
944:デフォルトの名無しさん
07/11/04 23:44:37
それならなお更numを渡せ
945:デフォルトの名無しさん
07/11/04 23:44:40
numごとって、本当に渡すわけじゃないぞ。アドレス渡すだけだから。
946:デフォルトの名無しさん
07/11/04 23:47:36
>>941
一次元配列を使うと32*1000バイト消費するが
そのままだと何も新規に生成しないから0バイトで済む
947:デフォルトの名無しさん
07/11/04 23:50:24
何かもう一個同じモノが作られるっぽいことが書いてあって、怖気づいてました。
ところでnumそのものの値も更新したい場合は、参照渡しするのですよね?
948:デフォルトの名無しさん
07/11/04 23:51:17
本当にnumそのものの値を変更したいのか?
949:デフォルトの名無しさん
07/11/04 23:53:11
C言語はふつうにやると配列は参照渡しになる
コピーを渡す方は難しい
950:デフォルトの名無しさん
07/11/04 23:57:50
クソの集まり創価学会
偽善者が政治活動、公明党
キチガイ集団が政治活動、公明党
池田狂信ネズミ講が政治活動、公明党
騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
951:デフォルトの名無しさん
07/11/05 00:10:49
>>948-949
すみません。。。混乱してきてしまって。
今は総和だけ求めてるのですが
やりたいのは行で計算をして、その行の値を全部更新して
その更新された状態で列を計算して、全部の列を更新するということをしようとしてます。
配列と関数の関係をやりなおしてきます。
952:デフォルトの名無しさん
07/11/05 00:31:26
>>951
それならなおさらアドレス渡しでいいじゃん
953:デフォルトの名無しさん
07/11/05 00:38:26
>引数の引き渡しには,値渡しと参照渡しがある.
>C言語では,特別なことをしない限り,変数は値渡し,配列は参照渡しになる
今まで配列も値渡しだと思っていました…納得できました。
ありがとございましたー
954:920
07/11/05 11:44:12
検証してくださった方、ありがとうございます。
#include <stdio.h>
int main(void)
{
int c;
do {
printf("%d ", c = fgetc(stdin));
} while (c != EOF);
return 0;
}
このプログラムを実行し、
コマンドラインから"abc^Zdef"を入力すると、(^ZはCtrl+Z)
D:\c\my\test5>test5.exe
abc^Zdef
97 98 99 26
と表示され、入力待ちになります。
955:920
07/11/05 11:44:52
それに対して、
61 62 63 1A 64 65 66
の内容のテキストファイル(↑は16進ダンプしたもの)をstdinにリダイレクトして
実行してみたところ、
D:\c\my\test5>test5.exe < test.txt
97 98 99 -1
このような結果になり、プログラムが終了しました。
プログラムは全てVC++2005でコンパイルしました。
どうやらコマンドラインの行中にEOF(0x1A)があった場合、
stdio.hで定義されたEOF(-1)ではなく、
テキストファイルでのEOF(0x1A)として読み込むようです…。
BCC5.5.1ではどちらの場合も、
97 98 99 -1
と表示され、プログラムが終了します。
956:デフォルトの名無しさん
07/11/05 12:56:46
製品版では直ってるのかな。
一応、MSに報告したらどうだろ。
957:デフォルトの名無しさん
07/11/05 13:09:38
別にエラーじゃないのでは?
EOFのASCIIコードを表示しているのだから
958:デフォルトの名無しさん
07/11/05 13:11:09
EOFのアスキーコードじゃないよ。
959:デフォルトの名無しさん
07/11/05 13:12:35
EOF じゃなくて SUB だな。
つーか単なる ^Z だが。
960:920
07/11/05 13:52:32
>>958 >>959
Wikipedia項目リンク
>ASCIIでは例えば、改行文字は0x10、水平タブは0x09、EOF(End Of File、ファイル終端マーク)は0x1Aである。
961:920
07/11/05 14:01:52
>>957
コマンドラインの行頭にあるEOFや、リダイレクトされたファイルにあるEOFは
stdio.hに定義されたEOF(-1)と読み取ることを考えると、一貫性が無いように思えます。
962:デフォルトの名無しさん
07/11/05 14:12:08
ASCII に EOF なんて無いだろ。
それ書いたの誰だよ?
URLリンク(e-words.jp)
Wikipedia項目リンク
URLリンク(www.mew.org)
963:デフォルトの名無しさん
07/11/05 18:42:18
そりゃ、文字コード体系表見てもEOFなんてあるわけないわな。
964:デフォルトの名無しさん
07/11/05 21:29:32
c言語の除算はどのようなアルゴリズムで行っているんでしょうか?
わかる方がいればよろしくお願いします
965:デフォルトの名無しさん
07/11/05 22:03:20
>>964
コンパイラによるんじゃないでしょうか。
あと、たぶん、かなりアセンブラよりの質問だと思います。
966:デフォルトの名無しさん
07/11/05 22:04:36
CPUよりの話でしょう
浮動小数点や整数演算はハードでします
967:デフォルトの名無しさん
07/11/05 22:09:11
テキストモードでfopenしたら0x1aで終了だろ
968:デフォルトの名無しさん
07/11/05 22:13:31
いつまで、CP/Mの呪いをひきづらなければならないのやら。
969:迷い人
07/11/05 22:36:25
こんばんは。つぎのようなプログラムがわかりません
1を入力すると
x
2を入力すると
x
xx
x
4を入力すると
x
xx
x
xxx
x
xx
x
xxxx
x
xx
x
xxx
x
xx
x
となるようなものです。途中まではかけたのですが肝心なところがよくわかりませんでした。
途中までは次のようになりました
970:迷い人
07/11/05 22:37:28
#include <stdio.h>
void X_sequence (int n);
void X_triangle (int n);
main()
{
int n;
printf("Enter a number : ")
scanf("%d",&n);
X_triangle(n);
}
void X_sequence(int n)
{
int i;
for (i=1; i<=n; i++)
printf("X");
printf("\n");
}
void X_triangle(int n)
{・・・・こっからわかりません!
教えてくださいおねがいします
971:デフォルトの名無しさん
07/11/05 22:39:06
if (n > 2) X_triangle(n - 1);
X_sequence(n);
if (n > 2) X_triangle(n - 1);
972:デフォルトの名無しさん
07/11/05 22:39:22
printf("1を入力すると\n
x\n
2を入力すると\n
x\n
xx\n
x\n
4を入力すると\n
x\n
xx\n
x\n
xxx\n
x\n
xx\n
x\n
xxxx\n
x\n
xx\n
x\n
xxx\n
x\n
xx\n
x\n
");
973:デフォルトの名無しさん
07/11/05 22:39:38
if (n >= 2) X_triangle(n - 1);
X_sequence(n);
if (n >= 2) X_triangle(n - 1);
974:デフォルトの名無しさん
07/11/05 23:01:21
ふとオープンソースの午後のこーだのソース見てみたら、C言語だったけど、
どれくらい経験つめばこれくらい書けるようになるんですかね・・・
975:デフォルトの名無しさん
07/11/05 23:15:15
>>974
5000時間くらい。
976:デフォルトの名無しさん
07/11/06 00:19:12
すいません、質問させてください。
rand関数とか、abs関数とか、stdlib.hで宣言されてるってことを聞きました。
で、stdlib.hを探してみて実際に見たところ、確かに宣言されてたんですが、
これら関数の実体って、どのファイルに定義されているんでしょうか。
もしくは、ソースファイルはついてないんでしょうか?(当方Mac OSXです)
見てみたいな、と思いまして・・
977:デフォルトの名無しさん
07/11/06 00:27:18
>>976
そういう関数はライブラリに中身がある
ヘッダーには呼び出しかたが書いてある。
実体を見たいなら、使ってるコンパイラメーカーに聞くしかない。
978:976
07/11/06 00:31:18
>>977
早速のお返事ありがとうございました!了解です。
979:デフォルトの名無しさん
07/11/06 00:33:50
scanfを使って整数型の変数に1〜100の値を入力された時のみ
続く処理をして、それ以外は再度入力を促すプログラムを作りたいです。
入力された値のエラーのチェックにはどんな処理が必要か
わからないので教えてください。
あと数値を入力してEnterを押して実行したあとに
前回入力した数値が残ったままになっているのを
消すにはどうすればいいですか?
980:デフォルトの名無しさん
07/11/06 01:14:14
>>979
#include <stdio.h>
int main()
{
int num;
char buff[12] = {'\0'};
do{
puts("1〜100の数値入力");
fgets(buff,sizeof(buff),stdin);
sscanf(buff,"%d",&num);
}while(1 >= num || num >=100);
/*
1以上100以下の数値が入力されたときの
処理をここに書けば〜
*/
return 0;
}
981:980
07/11/06 01:35:49
訂正
while(1 >= num || num >=100);
↓
while(1 > num || num >100);
982:デフォルトの名無しさん
07/11/06 01:58:33
scanfっつてんだから、scanfを使うべきなんじゃなくて?
俺ならこう書くぞ
} while (!(1 <= num && num <= 100));
983:デフォルトの名無しさん
07/11/06 02:02:57
論理演算が苦手そうに見えてもいいならそれでいいんじゃね?
984:デフォルトの名無しさん
07/11/06 02:30:32
すいません。
!についての質問なんですが、
if ( !(fp = fopen("a.c","r")) )
もしこれでfpがNULLでない場合(どこかのメモリアドレスつまり正の整数値)、
if文が偽(つまりNULLつまり0)となると思うのですが、
何故、!(正の整数値)がNULLつまり0になるのですか??ANSIのそういう仕様ですか?
if ( !5 )は偽でNULLつまり0??
(ちなみに、現在ほとんどのstdio.hで #define NULL 0 となっている)
985:デフォルトの名無しさん
07/11/06 02:33:54
!5といえば 1も2も3も・・・負数でさえ含まれますよね。0ももちろん含まれますが
986:デフォルトの名無しさん
07/11/06 02:47:08
#include <stdio.h>
int main(void)
{
FILE *fp;
if ( fp = (FILE*)(NULL == NULL))
;
printf("fp = %p\n", fp);
printf("(int)fp = %d\n", (int)fp);
printf("!5 = %p\n", !5);
return 0;
}
結果
fp = 0x1
(int)fp = 1
!5 = 0x0
987:デフォルトの名無しさん
07/11/06 02:58:34
NULL == NULLは真だから1が返るな
988:デフォルトの名無しさん
07/11/06 05:52:39
>>985
!5は「5以外」じゃないよ。
5を真偽値として評価して真、その否定で結果偽。そんだけ。
989:デフォルトの名無しさん
07/11/06 09:23:16
5以外は !=5 だわな。
990:デフォルトの名無しさん
07/11/06 22:06:26
レビューってどうやってやってる・・・?
なんか自分で書いたソースなのに、うまく説明できなくて凹みまくってる・・・。
頭の中じゃどんな風に動くのかわかってるんだけど、説明となると10あるうち2しか伝える事ができない・・・
991:デフォルトの名無しさん
07/11/06 22:41:32
君が超天才ならしょうがないけど、
凡人なら説明できない程度の理解としか周囲には写らないだろうよ。
誰にでも納得できる説明をする必要があるの?
仕事でレビュア対象に説明するだけなら、レビュアに疑問点・不明点を上げてもらって
それに回答することで納得して貰うのじゃダメ?
レビューの経験を積めば、レビュアの傾向が見えて対策も打てるけど、
例え経験不足だとしてもレビューの前に事前にレビュアと調整しておくって手もある。
凹む前にもっと考えて行動すべきだと思うけどね。
992:979
07/11/06 22:43:34
>>980 >>981 >>982
色んなサンプルソース読んでみても
scanfはあまり使われてないみたいなので
gets,fgetsに変更してみようとおもいます。
なぜなのかは、ぐーぐるさんに聞いてきます
ありがとうございました
993:デフォルトの名無しさん
07/11/06 22:55:21
>>991
あ、えーと、
現状まだまだ勉強の段階なんですが、
int main(void) じゃあそのvoidってナニ?なんでここにintとかおいてるの?っていう
いわば基礎中の基礎の部分なので、プログラムに一切関係のない人でも理解できるように発言して欲しい=学べる
ということなのでやってるんですが、経験をとにかく詰むしかないんですかね・・・うーん。
994:デフォルトの名無しさん
07/11/06 23:20:34
自分で書いたソースを客観的に見ることができないなら、他人に見て貰うといい。
相談できる人が身近にいればその人に協力して貰うのがいい。
相談できる人がいない、探す気もないならここにソース晒してコメントを貰うのでもいいんじゃね?
995:デフォルトの名無しさん
07/11/06 23:50:36
少しお尋ねしたいのですが、
struct _TEST a
{
int num;
char ch;
}test[100] = {0};
こうした場合、test配列の中身が全て0クリアされる動作は保証されていますか?
testが配列でない場合は動作が保証されているとどこかで伺った気はしたのですが
996:デフォルトの名無しさん
07/11/07 00:10:58
保証されている。ついでに言えばtest[100] = { 1 };として場合であっても
1が入るのはtest[0].numだけであって、残りは全て0になる。
997:デフォルトの名無しさん
07/11/07 01:06:24
>>996
ありがとうございます!
998:デフォルトの名無しさん
07/11/07 04:38:52
URLリンク(www.geocities.jp)
こちらのプログラムをVS2005でそのまま実行しても'fopen'の宣言を確認してくださいと出ます。
同HP (URLリンク(www.geocities.jp)) にあるc1.wavやらを読み込ませて実行したいのです。
fopenで配列を読んでいるのですが、ここにどうやってc1.wavなどを読み込ませればいいのでしょうか?
999:デフォルトの名無しさん
07/11/07 05:12:45
調べてたらコマンドラインで実行すらしらなかったのでなんとかなるかもしれないので失礼します。すみません。
1000:デフォルトの名無しさん
07/11/07 05:29:05
1000げっつ
1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5165日前に更新/251 KB
担当:undef