乙〜(^o^*)
4 :
デフォルトの名無しさん :03/06/06 22:42
おめ
おつ
おい、人は居るんじゃねーか(゚Д゚) どいつもこいつも物臭ばっかりだな
7 :
デフォルトの名無しさん :03/06/06 22:44
>>6 Yahoo!BBなんだよ・・・立てられた試しなし。
8 :
デフォルトの名無しさん :03/06/06 22:45
218 名前:デフォルトの名無しさん :03/06/06 22:40
#include <stdio.h>
main()
{
int a;
for(a=0;a<=25;a++;){
printf("%d"\n",a);
}
}
このソースのどこが悪い!?
219 名前:デフォルトの名無しさん :03/06/06 22:42
>>218 "の数
9 :
デフォルトの名無しさん :03/06/06 22:46
9げっと
10 :
そこの219 :03/06/06 22:47
>>8 なんだ文句あるか?
確かにforでセミコロンが一つ余計だが。
11 :
デフォルトの名無しさん :03/06/06 22:52
t2 δA=∫ {(∂/∂x)Lδx+(∂/∂v)Lδv}dt t1 プログラムにすると・・・・・めんどくせ
やぁ、なんか用かい?>(∂/∂x)
δA=0 以上。
やっぱできねぇなぁ
前スレで、「UNIXでSJISで"為替"などが文字化けする」質問に答えてくれたひと、 ありがとうございました。携帯だったので遅レス。
17 :
デフォルトの名無しさん :03/06/07 09:47
前スレでreturn,exitの質問に答えてくれた方、ありがとうございました。 ところで、プロセスと関数の違いがよくわからないのですが、 プロセスはプログラムを実行している状態のことで、 プロセスの中で関数が処理されているという理解でよろしいでしょうか?
正常終了は普通に終わることだと思うのですが、 異常終了って何ですか? どういうときに発生するのですか? 具体的に教えてください。 よろしくお願いします。
>>18 一般保護例外とか。
プロセスが殺されたりとか(unixならkill/winならタスクマネージャ等)。
>>17 (Cの)関数はC言語の概念。プロセスはOSの概念。
ごちゃまぜに理解してはいけない。
CだけでなくOSの本も読むべし。
>>18 正常に終了できなかったときに発生するのでは。
>>17 関数の実行(処理)単位は「スレッド」。
実行するためのリソースの単位が「プロセス」。
return はスレッドの処理を関数から抜けさせる。 main関数からスレッドが抜けると、プログラムは終了する。 プログラムが終了すると、プロセスが解放される。 exit()はどの関数に居ても、強制的にプログラムを終了させる。
「プロセス」って言葉はOSによって意味にズレがあるからなぁ。
黄色い看板
それはプロミス
w
「へるぷみ〜だよー」
29 :
デフォルトの名無しさん :03/06/07 14:47
対象のファイルの内容を、「スペース(連続しているスペースも含める)、
改行、タブ」ごとに区切って表示するプログラムが課題になりました。
連続したスペースなどを別々に評価するプログラムはすぐできました。
つまり、対象のファイルを
line1word1_line1word2
line2word1__line2word2
とすると(_はスペースとする)、正しくは
1:line1word1 2:line1word2 3:line2word1 4:line2word2
となるべきところが、
1:line1word1 2:line1word2 3:line2word1 4: 5:line2word2
となるプログラムです。そこで、これを修正すべく、文字列を
1文字ずつ評価する際に、一つ前の文字がスペース等であったかどうかを
記憶する変数を用いて、
>>30 のようにしたのですが、もっとスマートに
表現する方法はないものでしょうか?
なお、省スペースのため、コマンドライン引数の数のチェックや、
ファイルオープンエラーなどは省略しております。
filednumber→区切り番号
check→前の文字がスペース等であったかのチェック。デフォルトで0
#include <stdio.h> main(int argc,char *argv[]) { int fieldnumber=1,check=0; FILE *fp; char ch; fp=fopen(argv[1],"r"); printf("field%d : ",fieldnumber); while((ch=fgetc(fp))!=EOF){ if(ch==' '||ch=='\n'||ch=='\t'){ if(check==0){ fieldnumber++; printf("\nfield%d : ",fieldnumber); check=1; } } else{ check=0; putchar(ch); } } printf(" <<<end of file>>>\n"); fclose(fp); }
これによって、一応 line1word1_line1word2 line2word1__line2word2 は、正しく field1 : line1word1 field2 : line1word2 field3 : line2word1 field4 : line2word2 <<<end of file>>> と表示できるようになったのですが、どうもまわりくどいような気が してならないのです。どうか、よろしくお願いします。
>>29 fgets()で読みこみ、sscanf()でパース。
sscanf()はどこまで読み出したかを知ることができるって辺りがポイント。
つーか、fscanf()でいいじゃん。
>>32 こんな便利な関数があったのですか…<sscanf()
僕が使っている独習C(1994)という本には載っていなかったので、今しがた
検索してきましたが、ぱっと見ただけでも、今よりきれいなソースになりそう
でした。もちっと検索先を読んできます。
ありがとうございました。
>>34 全標準ライブラリ関数の一覧がないの?
はるひこ本でさえあるのに。。。
索引をひきましたが、fscanf()はあったもののsscanf()は無い様でした。 本が古いせいなのでしょうか… いずれにせよ、ファイル入出力の項に入ったところのため、fscanf()、 sscanf()のどちらも初見の関数なので、今から勉強はじめているところです。
1994年なら古いということはない。
ということはもしやクズ本?ガクガクブルブル Herbert Schildt という人の Teach Yourself C なる本の邦訳で、 独習C 翔泳社発行、1994/09/30初版1刷、1997/04/20初版7刷です。 先輩にもらった本なのですが、素直にK&R買ったほうがいいかも…? 今急に不安になって索引再度確認しましたが、やはりsscanf()は無い模様でした。
URLエンコードするにはどうすれば?
予想通りのレスでワラタ
46 :
デフォルトの名無しさん :03/06/07 19:15
gccっていうコンパイラはインストールしたんだけど 初心者向けでフリーのエディタって何でしょう?
すいません win用を・・・
そ れ な ら メ モ 帳 が あ る だ ろ う が
>>53 杜やvectorであさっていろいろ使って自分にあったものを探せばよろし。
ただなんだし。
スレ違いな質問はスルー推奨
57 :
デフォルトの名無しさん :03/06/07 20:40
58 :
デフォルトの名無しさん :03/06/07 20:50
Cで一応プログラミングようになったんだけど、 もうプログラミングする課題が尽きました。 課題を出していりるサイト知りませんか? もしくは、課題を出してもらえませんか? 簡単なのでも結構ですので。
宿題スレに投げられた問題をやってみるとか。
61 :
デフォルトの名無しさん :03/06/07 21:16
1〜10の中でランダムに一つ選ぶってのは どの関数を使うんですか? 記述を教えてください
>>58 なんのためにプログラミング勉強してるんだろ。
課題なんてやってないで、とっとと自分の好きなソフト作ればいいのに。
課題をとくのを目的にプログラムやってるのだろうか…
n元一次方程式の解を求めるプログラムを作ってください
visual c++.netです コンボボックスのドロップダウン型でドロップダウンした時の一番上の選択するやつのnIndex って0ですよね・・・?そしたらドロップダウンしない普通の入力欄のnIndex っていくつですか?−1でやるとエラーでちまうんですばい
多分すれ違い加茂
69 :
デフォルトの名無しさん :03/06/07 22:48
#include <stdio.h> void main() { int cnt; int score[5]; /* 箱を5つ分、用意しています。 */ score[0] = 86; score[1] = 65; score[2] = 44; score[3] = 92; score[4] = 72; for (cnt = 0; cnt < 5; cnt++) { printf( "%d人目の数学の得点は%dです\n", cnt + 1, score[cnt] ); } } なんでかコンパイル通らないんですけど
>>69 エラーメッセージくらい書きなよ。
全角スペースを使っているからだと思うけど
すいません他スレいきますですはい
全角スペースはインデント維持のためじゃね? エラーメッセージ書けは同感だが
>>72 voidとmainの間、項と演算子の間もか?
はやくエラーメッセージ書いてくれ。 気になるだろ。
>>69 漏れも、このHPで勉強したなあ…
これそのままコピーしてないか?
それなら
>>70 で正解だと思う。
>>75 ネタじゃなくてそういうことか・・・・
<PRE>使えよー
78 :
デフォルトの名無しさん :03/06/07 23:02
ファント・ホッフ係数の計算ロジック作って。 モティロン、ポインツァを駆使して。
「サンプルコードをコピペするな。手動で入力せよ。」 なんかの雑誌に書いてあった
80 :
デフォルトの名無しさん :03/06/07 23:04
>>78 は
1.ファント・ホッフのi係数についてよくわかってない
2.C言語についてよくわかっていない
のどちらか。もしくは両方。
要求がわけわからなすぎ。氏ね。
81 :
デフォルトの名無しさん :03/06/07 23:11
int a=rand()%10; みたいに記述して変数aに0〜9の数をランダムに代入したいのに、 実行するといつも同じ数しか代入されてません。 何かミスがありますか?しかも0です
82 :
デフォルトの名無しさん :03/06/07 23:11
>>81 rand()呼ぶ前に、
srand(time(NULL));
入れてみ。time.hをインクルードしてな。
>>81 真っ先にsrand(time(NULL));とでもしておけ。
rand() の前にsrand()を呼ぶ
やっぱり種はグローバル変数なのかな。
>>88 srandで設定したものをrandで使うんだからグローバル変数なのかなと。
VC++では違うみたいだな。
92 :
デフォルトの名無しさん :03/06/07 23:26
#include <stdio.h> #include <time.h> main(void) { srand(time(NULL)); int a=rand()%5; printf("%d",a); } こんな感じですか?
>>92 そういうこと。
でもそれじゃコンパイル通らないと思うよ。
94 :
デフォルトの名無しさん :03/06/07 23:29
あっ、しまった。
>>92 stdlib.h入れろ。
宣言より前に関数呼ぶな。
98 :
デフォルトの名無しさん :03/06/08 00:24
#include <stdio.h> int main(){ printf("\n今から質問をします"); getchar(); printf("何の日ですか?\n\n"); getchar(); printf( "1 : 〜の日\n2 : 〜〜の日\n3 : 〜〜〜の日"); int a; a=getchar(); if(a==1){ printf("正解です!おめでとう!\n"); } else{ printf("残念!正解は1でした\n"); } }
99 :
デフォルトの名無しさん :03/06/08 00:25
さぁ、間違い探しをしよう(ぉぃ
int a;の場所。
101 :
デフォルトの名無しさん :03/06/08 00:31
たかがインデントなんだが・・・。 どうしてもきれいなソースにならない!!! インデントについて詳しく書いてあるページない?
インデントがなくてみにくい int mainなのにreturnしてない 「今から質問します」がいきなり1回改行して出てくる上にそのあと改行しない 「3 〜〜の日」の後も同様 a=getchar() int型に直ですか
a=='1'
104 :
デフォルトの名無しさん :03/06/08 00:42
scanfで取り込んだ整数の後ろに文字を表示させたいのですが、 自動改行されてしまって上手く表示することができません。 どうすればよいのでしょうか?
意味がわからない。 ソースきぼんぬ
>>102 getcharはintで受けるべきなのだが…
あ、ごめん、ボケてた。そのあと、if (a==1)なんてやってたな。
5問の問題を出題して、何問正解したかを答えるものです #include <stdio.h> main() { int q,w,e,r,t,a; a=5; printf("問題を5問出題します\n"); printf("第一問:10+10=? A."); scanf("%d\n",&q); if (q==20) printf("正解です\n"); a=a+1; if (q!=20) printf("不正解です\n"); a=a-1;
printf("第五問:10*10*10=? A."); scanf("%d\n",t); if (t==1000) printf("正解です\n"); a=a+1; if (t!=1000) printf("不正解です\n"); a=a-1; if (a==10) printf("おめでとう!全問正解です!"); else if (a==9) printf("4問正解です。"); else if (a==8) printf("3問正解です。"); else if (a==7) printf("2問正解です。"); else if (a==6) printf("1問正解です。"); else printf("0点です"); return 0; }
56です。 と表示させたいんです。 int n; scanf("%d",&n); printf("です。\n"); これだと、 56 です。 と表示されてしまうのです。
こんな感じなんですが、実行すると第一問の答えを20と入れても進まず、 もう一度数字を入力しなきゃいけなくなります。 2つ入力すると次の問題に進みますが・・・ 第一問の際に1問目の答えの20、続けて2問目の答えを入力すると2問目は正解と言われます。 続いて2問目が出てきますがこの時3問目の答えを答えないと3問目が不正解になります。 一つづつ問題と答えがずれてしまうんですが何故ですか? 5問目になると強制終了します
(^_^;)
if (q==20) printf("正解です\n"); a=a+1; /* ←必ず実行されるけどいいの? */ if (q!=20) printf("不正解です\n"); a=a-1; /* ←必ず実行されるけどいいの? */ こういうのはifとelseにしよう。 あとa=a+1はa++、a=a-1はa--と書いた方がよい。
>>110 printf("%dです。\n", n);
正解でも不正解でも a は変わらないのね。
aを0から初めて、正解した数だけ足したら? んで、最後に if(a == 5){ printf("全問正解です!\n"); } else { printf("%d問正解です。\n",a); } ってすんのさ。
>>114 scanf関数の中はどんな形にすればいいんでしょうか。
どうもです。 >113 printf("第一問:10+10=? A."); scanf("%d\n",&q); if (q==20){ printf("正解です\n"); a=a++; } else { printf("不正解です\n"); } こんな感じでいいんでしょうか?
>117 あーなるほど、そういうやり方も出来ますね。 簡潔なモノを書けるよう無い頭振り絞るようにします それで、問題と答えがズレてしまうのは何故なんでしょうか・・・?
>>119 > a=a++;
違う。これじゃ有名な未定義コードになってしまう。
a++;とだけ書く。
もっと言えば、5問の問題の文字列と正解を配列にいれといて、 forで回したほうが完結だし、あとで問題を増やすのも楽チンだな。
さらに言えば、問題の数式の部分だけ別の配列にいれて、
出題時にその数式を元に答えを計算すれば、
問題と答えが食い違うことがなくなるな。
そうとう大変だけど。
ズレるのはなんでだろうねぇ。
>>108 と
>>109 の間が肝心なところなんだろうけどぶった切れてるからわからない。
今ではelseの登場によってソースも変わってるだろうし。
125 :
デフォルトの名無しさん :03/06/08 01:49
なんで a = 5 からスタートしてるん? どういう考えか興味ある。
a5=英語のテスト
>>121 ヽ ̄ ゙̄\
\ ヽ \
ヽ ゙!
/ |
/ ,.イ
∠___/ :|`ヽ.、
ノ '! \-、
_,.=''1 ヽ, `'
ヽ'" i| |
! |
呼んだ〜?
#include <stdio.h> void main(void) { int a; int b; char c; //////////////////////////////////////////////////////////////// // 四則演算をするための値を入力 // //////////////////////////////////////////////////////////////// printf("1つ目の数値を入力してください="); rewind(stdin); scanf("%d",&a); printf("2つ目の数値を入力してください="); rewind(stdin); scanf("%d",&b); printf("演算子を入力してください="); rewind(stdin); scanf("%c",&c);
//////////////////////////////////////////////////////////////// // 結果の出力 // //////////////////////////////////////////////////////////////// printf("\n\t\t実行結果の表示です\n"); if(c!='+') { if(c!='-') { if(c!='*') { if(c!='/') { if(c!='%') { printf("\t\t演算子がおかしいです。"); } else if(b==0) { printf("\t\t%d%c%d=0では割れません。",a,c,b); } else { printf("\t\t%d%c%d=%d",a,c,b,a%b); } }
switch使いなよ。
else if(b==0) { printf("\t\t%d%c%d=0では割れません。",a,c,b); } else { printf("\t\t%d%c%d=%d",a,c,b,a/b); } } else { printf("\t\t%d%c%d=%d",a,c,b,a*b); } } else { printf("\t\t%d%c%d=%d",a,c,b,a-b); } } else { printf("\t\t%d%c%d=%d",a,c,b,a+b); } printf("\n\n\n\t\t\t\t\t\t"); }
間違ってたら指摘してください。 課題で先生に ifとfor文しか教えてないから他のは使うなといわれてます 0の時の判断もホントはしなくていいのですが
stdinにrewindって使えるの?
五則演算
rewindはしないといけないといわれまつた
全部==にしときな
そっちのほうが分かりやすいからでつか?
というか、!= にするメリットってあるか?
演算子に変なの入れた時
フローチャートも書かされてるんでif(c==+)if(c==-)if(c==*)とやってくと 縦に長くなり1枚に収まらないのでネストが一番かと
>>123 そうすると、
56
56です。
と表示されるのですが・・・。
フローチャート指向プログラミング
スマソ。今度からはめんどくさがりません
145 :
デフォルトの名無しさん :03/06/08 03:37
UNIX系でよくある設定ファイルを読み込むロジックって なにか一般的な方式(ライブラリとか)あるんでしょうか? 例えばこんなの ########## # This is your ID info ########## # your name firstname=Taro familyname=Yotsuya # your birthday year=2003 month=6 #day=5 day=6 聞きたいのは「こうすれば出来るじゃん!」っでなくて 「普通こうやるよねー」とか「これ使うといいよん」って意見で。
>>145 strtok か strchr を使うといいかと。
>>142 それはそういうもの。
入力の行と、出力の行は別々になる。これはどうしようもない。
どうしても嫌なら、プログラムの1番最初と、printfの直前に
system("clear");
とでも入れておけ。
Ctrl+D(Windows なら Ctrl+Z だっけ?)で入力終了すれば 改行されずにすむね。
A:Ctrl+D B:Ctrl+Z C:Ctrl+S D:Ctrl+C どれでファイナルアゥンサー?
コーディングスタイルで質問です switch のときに、 switch (..) { case 'a': ... というように、 switch と case でインデントをそろえるものと、 switch (...) { case 'a': ... のように、 switch と case で段差をつける2通りがありますが、どちらのほうが一般的ですか?
俺は下 でもどっちでもコード見る時に大差はない
お早う >122,124 ダイテル本持ってる人にしか解らないけどまだダイテル本の56Pのとこまでしか覚えてないんですよ forとか解らないです。とりあえず今覚えてるので書けるかなーと思って書いてみたんですけれど。 >121 thxです >125 今思うと何ででしょうね・・・・ 自分でも解りません
全文です>124 #include <stdio.h> main() { int q,w,e,r,t,a; a=0; printf("問題を5問出題します\n"); printf("第一問:10+10=? A."); scanf("%d\n",&q); if (q==20){ printf("正解です\n"); a++; } else { printf("不正解です\n"); } printf("第二問:10*10=? A."); scanf("%d\n",&w); if (w==100){ printf("正解です\n"); a++; } else { printf("不正解です\n"); }
printf("第三問:10÷10=? A."); scanf("%d\n",&e); if (e==1){ printf("正解です\n"); a++; } else { printf("不正解です\n"); } printf("第四問:10-10=? A."); scanf("%d\n",&r); if (r==0){ printf("正解です\n"); a++; } else { printf("不正解です\n"); }
printf("第五問:10*10*10=? A."); scanf("%d\n",t); if (t==1000){ printf("正解です\n"); a++; } else { printf("不正解です\n"); } if(a == 5){ printf("全問正解です!\n"); } else { printf("%d問正解です。\n",a); } return 0; }
qwertと5つも意味不明な名前の変数を設ける理由が判らない。
>>157 この変数を選んだ理由も知りたい(w
もっと分かりやすい変数名をつけよ。
変数名は ans とかのほうがわかりやすいな。 それと、ans[5]にして1問めから順にans[0], ans[1]…といれていったほうがいいかな。
で、ズレのはなんでだろう。漏れもわからん。 ちなみにifとelseの間は普通は1行空けたりしないぞ。 あと、みなさんへ。 ソースを晒すときは、めんどうでなければインデントは全角スペースで。 unixならviで:%s/ / /g 秀丸ならタブとかスペース4個を全角スペース2個にすればよろし。 めんどいけど。
161 :
デフォルトの名無しさん :03/06/08 12:35
char *str = "HelloWorld"; と char str[] = "HelloWorld"; の違いがわかりません。 どうなんですか?
>>158 俺には分かるぞ!
喪前のキーボードのQから右に読んでみそ。
( ´A`)
Q J K X B M W V Z
166 :
デフォルトの名無しさん :03/06/08 13:09
>>163 ありがとうございます。
sizeof()でサイズをとりたかったんですけど
んじゃあ、ムリなんですか?
sizeof(str)だと4(ポインタのサイズ?)が返ってくるんで。。
167 :
無料動画直リン :03/06/08 13:13
168 :
デフォルトの名無しさん :03/06/08 13:13
>>166 上ならポインタのサイズ、下なら配列のサイズ
>>164 俺のマシンのrootのパスワードだ ( ´A`)
最後にyがつくけど
>>154 こういうんじゃダメなの?
#include <stdio.h>
main()
{
  char *mondai[5] = {
    "第一問:10+10=? A",
    "第二問:10×10=? A",
    "第三問:10÷10=? A",
    "第四問:10−10=? A",
    "第五問:10×10×10=? A"
    };
  int kotae[5] = {10+10,10*10,10/10,10-10,10*10*10};
  int i,in,count=0;
  printf("問題を5問出題します。\n");
  for(i=0;i<5;i++){
    printf("%s",mondai[i]);
    scanf("%d",&in);
    if(in==kotae[i]){
      count++;
      printf("正解です\n");
    }else{
      printf("不正解です\n");
    }
  }
  if(count==5) printf("全問正解です!\n");
  else printf("%d問正解です。\n",count);
}
あら・・・・
>>171  だらけでみにくいぞ
#include <stdio.h> main() {  char *mondai[5] = { "第一問:10+10=? A", "第二問:10×10=? A", "第三問:10÷10=? A", "第四問:10−10=? A", "第五問:10×10×10=? A" };  int kotae[5] = {10+10,10*10,10/10,10-10,10*10*10};  int i,in,count=0;  printf("問題を5問出題します。\n");  for(i=0;i<5;i++){  printf("%s",mondai[i]);  scanf("%d",&in);  if(in==kotae[i]){  count++;  printf("正解です\n"); }else{  printf("不正解です\n"); } }  if(count==5) printf("全問正解です!\n");  else printf("%d問正解です。\n",count); }
nbspのあとにセミコロンがないから。
>153で教本?の最初の方までしか覚えてないっぽいからcharとか知らないんじゃない? 漏れダイテル本持ってないから解らんけど
>>164 それか!(w
そんな命名方法考え付くのに感心する。
今まで一人でプログラムを組んでた時は、統一性のない汚いソースでも別に良かったんですが 複数でプログラムを組むことになったので、読みやすい綺麗な書き方を見本にしたいので 参考になるサンプルソースないですか?
ないです。
>>180 2項演算子の左右は空白を空けろ
forやifにぶら下がる処理は必ず{}でブロック化しろ
{}をif()の横から始めたり下から始めたり場所によって違うのはやめろ
コンマやセミコロンでデータや式を列挙する場合は空白を空けろ
変数の命名法はある程度の指針を決めておけ
コメントはちゃんと書け
めしは上手く作れいつもきれいでいろ
>>180 設計をきちんとしる。コーディング規約つくれ。クロスレビューしる。
185 :
デフォルトの名無しさん :03/06/08 17:19
>186 ノイズが多いし。ハンガリアンは嫌いだ
>>186 ファイルローカルだってさ(藁
内部リンケージだろ(藁
189 :
デフォルトの名無しさん :03/06/08 18:14
>>188 そんくらい目くじら立てるなよ。
どうせお前も他人が聞いたら変な言葉の使い方してるんだから。
190 :
デフォルトの名無しさん :03/06/08 18:14
Cならなんでもいいんですよね。 さっきVBに技能検定があることを知り、つい笑ってしまいました。 それは置いといて・・ Cにも検定はあるんですか?
>>190 ある。糞の役にも立たないのが。
それはそれとしてなぜ「C言語 検定」でぐぐるくらいしないのか。
>>190 持ってるけど
履歴書埋めるくらいの役にしかたたない
ド素人ではありませんと証明するくらいか…
195 :
デフォルトの名無しさん :03/06/08 18:36
Cっていきなり3級なんですね。 がんばろ
>>194 見せる相手によっては「こんなもので実力の証明にしようとしやがって」
とかバカにされるので注意な。ど素人以下の扱いを受けることあります。
>>195 だから、3級も2級も使えないって。
1級は見たことないが、こんな資格の1級まで目指すやつキモい。
>>196 そのとおりです。
198 :
デフォルトの名無しさん :03/06/08 18:58
マジっすか、まぁもし検定受かったら 履歴書に書くときは気をつけよう。
自慢げにしなければ書いてもいいと思うけど・・・・
200 :
デフォルトの名無しさん :03/06/08 19:01
すかさず200げと。 履歴書に200げと!って書いていい?
個人的にはどんな資格でもないよりはマシだと思うけど、 過剰なくらい資格をバカにする技術者もいるんで、注意が必要だな。
C言語の試験ってCの歴史まで出題されるあれか?
203 :
デフォルトの名無しさん :03/06/08 19:09
204 :
デフォルトの名無しさん :03/06/08 19:10
Cmachineってどうなのよ?
205 :
デフォルトの名無しさん :03/06/08 19:13
>>187 いや、とりあえず使う人間全員で統一した見解を持つのは必要だろ?
このリンク先が気に食わないなら、自分で統一ルールを作って晒してくれ。
>>204 誰も使いたがらない、不燃ゴミだな。
なんかうちの高校ではみんなが自由つかえるようにフリーのソフト を使っていますとか言っているんですが、もうこの高校に入学した 時点で終わりですか?
せめて、完全じゃなくてもANSI C準拠を目指したコンパイラを使った方がいいって。
>>207 その程度で高校が終わってるかどうか判断しようとする
お前が終わってるよ。確実にな。
マジレスするならば。 C machineは標準Cと挙動が違いすぎるのでCの学習には全く適さない。 では、プログラミング一般の学習にはどうかというと、Cは抽象度が低すぎて これまた適さないと思うんだな。何がいいかは意見が分かれるだろうけど、 おれだったらSchemeかOcamlかRubyかPythonあたりだと思う。 結論としてCの習得にもプログラミング一般の習得にも適さないので、 C machineは使わんほうがいい、と思う。その高校が終わってるかどうかはしらんw
C Machineのctype.hを見てみたら引数を複数回評価するようになっていたけどいいのかな? 普通はisalphaなどはテーブル参照で実装すると思うけど。
>>212 別にマクロであることさえ分かってればいいんじゃない?
でもあまり#ifを使っていないからみやすいぞ(笑)
C machine を実際にDLしてみた。 実装していない関数が多いことも問題点として挙げられる。 mallocはあるが、callocやreallocが無かったり、 atoi/atofはあるが、strtolとかが無い。 ただ、学校で「アルゴリズムの学習」程度ならまあ使える。 BCCやらGCCをインストールするのに比べて、設定が楽だ。 標準Cにはないグラフィック関係を、簡単に使えるのもいい。 でもC言語の勉強にはならないな。
qsortはあるのにbsearchがない・・・abortもないよぉ。
よくわからんが、UNIX系のマシン1台あれば勉強できるような気もするが。 telnetしてvi(なんでもいいけど)してcc(gcc)で十分だろ。
char *argv[]とchar **argvを違うものとするのか・・・・
独り言? 質問じゃないならいちいちageなくても。
>>224 スレ間違えていないか?
「スレ立てるまでも・・・」じゃなかったか?
>>224 scanf("%d",&atai2");
とかなってるとこあるぞ。
見事にスレ間違えました。 関数呼び出しに ) がない(関数 main ) 文字列または文字定数が閉じていない(関数 main ) メイン関数閉じてないのはアップする時のミスです。 コンパイラではちゃんと閉じてコンパイルしてます。
いえいえ、それほどでも♥
激しく質問。 メイトリックスみたいに流れるコード(数字のみ)を作りたいんだけど、、、。
#include <stdio.h> #include <stdlib.h> main() { line10:printf("%d\n", rand() % 10); line20:goto line10; return 0; }
>234 せめてforかwhileで回してよ…
店頭のMSXマッスィーンを思い出す…goto
239 :
デフォルトの名無しさん :03/06/08 23:06
文字列の中の例えば!〜〜!の間の文字を抜き出すには どの関数使えばいいですか?
240 :
デフォルトの名無しさん :03/06/08 23:06
241 :
デフォルトの名無しさん :03/06/08 23:06
文字列の中の例えば!〜〜!の間の文字を抜き出すには どの関数使えばいいですか?
242 :
デフォルトの名無しさん :03/06/08 23:07
243 :
デフォルトの名無しさん :03/06/08 23:07
forかなんかで自分で書け javaでもそんなメソッドないぞ!
245 :
デフォルトの名無しさん :03/06/08 23:08
ありがとうございます。 簡単な記述例をおねがいできないでしょうか?
>237 わからんにゃー。MSXに触ったことにゃーし
べつに分かったからって何の意味もない。 そんなもんで威張っている奴が居たらバカ。
>>245 #include <stdio.h>
#include <string.h>
int main()
{
char str[]="I!have no!money"; /* ←必ず書き換え可能なものにすること */
char *delim="!",*p;
printf("%s\n",strtok(str,delim));
while(p=strtok(NULL,delim))
printf("%s\n",p);
return 0;
}
出力結果
I
have no
money
250 :
デフォルトの名無しさん :03/06/08 23:19
ありがとうございます。 参考にさせていただきます。
>>250 ちなみに二文字以上の文字列で区切ろうとする場合にはstrtokは勧められないので注意を。
第二引数のそれぞれの文字で区切ろうとするからね。
こんなのできたっち #include <stdio.h> #include <math.h> int main(int argc, char* argv[]) { const double PI = 3.1415926535; const int pix= 40; for (double i=0.0; i < 360.0; i++) { double ans = sin(i/PI/2); int loop = ans * pix; if (loop >= 0) { for (int sp=0; sp < pix; sp++) { printf(" "); } for (int j=0; j < loop; j++) { printf("+"); } }else { for (int sp=0; sp < pix+loop; sp++) { printf(" "); } for (int j=0; j > loop; j--) { printf("-"); } } printf("\n"); } return 0; }
254 :
名無し@沢村 :03/06/08 23:40
sprintf("ある晩、二人の男が風呂に入った。 一人がもう一人のちんぽを見た。 そいつのちんぽはドス黒かった。使い古した後がうかがえた。 「おまえ、ずいぶん女を泣かせただろ?」 「いや、おれはまだ童貞だ」 そいつのちんぽはせんずりで使い古したのだった。 ");
CStringの文字をchar型に代入したいんですがうまくいかないです char a; CString b; a = (LPCTSTR)b; どこが悪いっすか?
スレ違い・・・・ Stringなのにcharに代入できるの?
間違えた char a[200]; CString b = "aiueo"; a = (LPCTSTR)b; すれ違いスマソ。 え、てかできないんすか?
259 :
デフォルトの名無しさん :03/06/08 23:52
#defineってどういうことですか?
>>256 MFCへ
b.GetBuffer();
>>258 Cの範囲ならそれはできない。配列名に代入は不可。C++はどうだか知らないけど・・・
>>259 記号定数の定義
C++でも配列名には代入できない
と思ったけど凄いスレ進行遅い。。。 文字数取得の後どうすれば?
strncpy ヲツカエ
ああああ!わかったかも。 ちょっと試してきまつ
>>267 CString は LPCTSTR (const char FAR *) へのキャスト演算子をオーバーロードしてあるので
CString 「から」の strncpy でのコピーは可能。
CString 「へ」の strncpy でのコピーは(GetBuffer使わないと)無理だけど。
char a[200]; iRadioCheckId = "kakikukeko"; CString str(a); str = str + iRadioCheckId; a = (LPCTSTR)iRadioCheckId.GetBuffer(iRadioCheckId.GetLength()); AfxMessageBox(a); でコンパイル通らないっす。なぜにぃ
やっぱりそういう仕組みか。
>>269 配列名には代入できないって言ってるでしょ。
で、だ。何で CString から char 配列にコピーしたい理由は何なんだ?
「何で」を消し忘れ
URLエンコードするのに使います
URLエンコードは元のままの方がしやすいと思うけど・・・ それともchar *で受け付けるライブラリでも使うの?
みなきゃよかった(T_T)
え?え?
つーかおまいらスレ違うだろ。
>>278 まぁ、自覚してるからいいんじゃない?
>>277 >これはあくまでも「参考」程度にとどめて、悪いところを直して使って下さいね。
なので、コピペでそのまま使わないで、
自分で関数を作るか、他のを探すかするのを勧める。
まぁ、よりひどいのを作られても困るので一応何とかする方法を。
csource の型を const char* に変更して
(ついでに cbuffer の型を char* に変更して)、
sprintf(ctemp, "%%%02X", *(csource + lcount));
を
sprintf(ctemp, "%%%02X", (unsigned char)*(csource + lcount));
に変更してやれば、
csource へ CString オブジェクトをそのまま渡せるはず。
URLエンコードってもっと単純なはずだよね? 英数字とスペースと_-.*以外を%+二文字の16進数字列にして、スペースを+におきかえるだけだよね?
マジでサンクスです! すれ違いの馬鹿野郎にまじでどうもです。 早速ためすぞこらー
エラー大量産出。。。
CのコードC++に書き換えなきゃだめかぁ。
>>276 で言ってた方法とは??
287 :
デフォルトの名無しさん :03/06/09 01:01
了解です。これ以上スレ違いも痛いんで他スレに行きます。。 どもでした!
>>283 その程度の仕様っすか。
ならこんなんでええな。
全角空白を半角空白かタブにでも置換してから使うように。
#include <stdio.h>
#include <ctype.h>
#include <assert.h>
void UrlEncode(char *dst, size_t size, const char *src)
{
size_t iDst;
size_t iSrc;
char let;
for(iSrc = iDst = 0; src[iSrc] != '\0'; ++iSrc) {
let = src[iSrc];
if(isalnum(let) || strchr("_-.*", let) != NULL) {
if(iDst >= size - 1) {
break;
}
dst[iDst] = let;
++iDst;
} else if(let == ' ') {
if(iDst >= size - 1) { break; } dst[iDst] = '+'; ++iDst; } else { if(iDst >= size - 3) { /* 3 はエンコードのサイズ */ break; } sprintf(&dst[iDst], "%%%02X", (unsigned char)let); iDst += 3; } } assert(0 <= iDst && iDst < size); dst[iDst] = '\0'; }
>>277 ロジックそのままでいいから、CStringかstringをつかって書き直したほうがいいな。
わ。。 ちょっくら試してみます!今度こそうまくいけぇ〜
sprintfって便利だよなぁ。
ビルドエラータスク100件越えますた・・・ Unicode識別子はサポートされないエラーが大量発生です。 環境はVS.NETです。
>>294 全角スペースを半角スペースに置き換えた?
全角空白を半角空白かタブにでも置換してから使うように。 全角空白を半角空白かタブにでも置換してから使うように。 全角空白を半角空白かタブにでも置換してから使うように。 全角空白を半角空白かタブにでも置換してから使うように。 全角空白を半角空白かタブにでも置換してから使うように。 全角空白を半角空白かタブにでも置換してから使うように。 全角空白を半角空白かタブにでも置換してから使うように。 全角空白を半角空白かタブにでも置換してから使うように。 全角空白を半角空白かタブにでも置換してから使うように。 全角空白を半角空白かタブにでも置換してから使うように。
もうまじ馬鹿と言って下さい あぁもう自分が嫌
286ですが やっぱりだめですか?
>>298 んーと、parse 目的なの〜?
Windows なの〜?
だとしたら、msxml なんかに任せたほうがいいんじゃないの〜?
引数がよくわからんです char *dst,←文字へのポインタ? size_t size,←文字数? const char *src←これ何・・・?
>>300 そのポインタが指す先の内容を書き換えないという宣言だ。
もし書き換るようなそぶりを見せたらコンパイラが叱ってくれる。
srcを変換したものをdstに入れるんじゃないの? sizeはdstの領域の大きさだと思う。
う。言葉足らず。301はconst char *srcについてな。
306 :
デフォルトの名無しさん :03/06/09 02:07
char型をint型に変換する関数は知っているんですが、その逆、つまり int型をchar型に変換(文字列のポインターを渡す?)関数ってのを知りたいのですが 教えてください。
多分sprintf
馬鹿でスマソ UrlEncode();の引数には何をいれれば・・・? srcを変換した物をdstに入れるって事は dst=変換後に入れる変数のポインタ size=その大きさ src=変換する文字列へのポインタ でよい? あとこのプログラムCStringを渡せないっすか・・・?
だからスレ違いだってば。
>>308 secとしては渡せるけどdstとしては渡せない。
>>309 まじすいません。あと少しだけおながいします
ここまで来て他スレで聞いたらわけわかんなくなっちまうんで
>>310 確かに渡せました。
>>289 この関数日本語入れるとエラー出ちまいます。
マジでお手数ですが直していただけるとうれしいです。
それまで自分で直してみるけどむりっぽ。。
let を unsigned char にしてみて。
>>311 sizeは充分な大きさにしている?
最悪srcに渡す文字列の3倍必要だけど
と、喜びもつかの間 %E3%81%82←Googleのエンコード %A4%A2←Yahoo!のエンコード %82%A0←上の関数のエンコード ぐぐるのエンコードにできまつか??
やってみたらよかんべ
>>315 何がしたいのか知らんが、GoogleだってSJISで渡せば同じになる。
とりあえずCと関係ないと言っておきます。
S-JISで渡す方法? 投稿フォームのあるページをS-JISで書けば多くのブラウザはS-JISで送ると思うけど・・・ Cと関係ないね。
なにぃ・・・。 | | | |_∧ |_|ω・`) <意地悪しないで教えてほしぃぽ | と ) | ̄|u' 旦 """"""""""
てことはプログラム上でやるのは無理・・・?
URL エンコードってものが良く分かってないような…。 いずれにせよスレ違いなのでお帰り下さい。
その関数は漢字のエンコード方法を知らない。 問題は、あんたの使っている環境だ。
>>324 まじでもうちょっと頼みます。
いまさら他にも行けないので。。。
プログラムが分かるように変換とまでしか分かってないです
>>325 環境って何を書けば・・・?
VS.NET WinXP IE6
とかですか??
>>326 まず何がしたいのか書け。
URLエンコードなら、既にできてる。
ああああ! 意味が分かった!SJISで渡したら確かにエンコード結果一緒でした。 ググルはUnicodeでやっとりました。。
ShiftJisの文字列を関数に渡せばShiftJisがエンコードされるし、 EUCの文字列を関数に渡せばShiftJisがエンコードされるし、 ・・・ 自分が渡した漢字がどんなコードかも判ってないなら先ずはそこからだな。
がーん。めっちゃ簡単なプログラムなんで さらっと見ていただけたらいいんすけど。 じゃあ口答で。。 ソフトで検索ワード入れてアドレス直接精製して そこから直接ぐぐる検索するためにソフト作ってます。
・・・・・Googleのトップページをダウンロードしてちょこっとソースいじるだけでよさそうな・・・
それやろうと思ったんすけどどうやればいいのか さっぱりわからんかったんでアドレス精製しようと 思ったんです。
336 :
デフォルトの名無しさん :03/06/09 18:37
>>335 何でそんな面倒なことをCでやろうと思ったのかよくわからん…
もっと楽なのがあるだろうに。Perlだとかなんだとか。
どうしてもソフト作りたかったので。。。 さっきのDLL使えばなんとかなります?
もうイイから消えてくれ。ウザい。
すいませんでした。 おとなしく消えますです どもでした
>>338 なるほどそういうことか。
じゃあまず、文字コードとか、エンコーディングとかでぐぐって、
そのあたりを勉強してみなさいな。複雑でいやになるから。
作ってみたかった程度で手におえるものじゃなかったりするんだよな…
CGIじゃなかったのか。
前そのまま入れたとき使えなかったのに。。。 もう欝で死にそうです
IEで使うのだけが目的ならそれで充分っしょ? どっちみちスレ違いだけど。
エンコードしなければ文字化けする。 実際文字化けしている。 よって使えない。 分かった?
使えないのは確かだが「文字化けする」からダメなわけではない。
しかし、.Netはurlencodeのライブラリもないのか。
>>353 あるよ。C/C++には無いみたいだが。
じゃああれだ。
もまえらが使っている有用なライブラリ公開すれ。
まずは
>>356 から。
終了
標準ライブラリ
winmm.lib 音鳴らすのに今日初めて使ってみた
cygwin1.dll
oreno.dll
関数の引数で foo(void *bar) { というのを見かけたのですが、 この void 型のものはどういう型を受け取ることが出来るのですか?
void型じゃない。
>>361 いろいろ
intとかcharとか
関数に渡す時は、キャストすんのかな
intやcharはだめだろ。キャストすれば渡せるけど危険。
>>361 ポインタなら何でも
>>361 void * … int や char などと違って、
ポイント先のバイト容量が不明なポインタ型
>>365 ポインタの++できんつーことか? 1なら charとかわらんな
そういえばsizeof(void)ってできるのね。
>>366 >>367 sizeof(void)が1を返すので判るとおり、確かにchar *に似た振る舞いをするね。
でも、普通のコンパイラなら警告出すんじゃない?
ついでに言うと、char *を渡して、内部でint *として参照すると
バスエラーを起こしかねないので要注意で。
void *はデリファレンスできないが。 あと、プロトタイプがあれば、別にキャストしなくても ポインタでさえあれば何でも渡せるぞ。
誰かポインタをキャストしなければいけないと言ったか?
void *に大してintやcharを渡せるのか・・・・警告は出るけど。
じゃあ
>>363 へか。
なんかどっかにvoid *の扱いはCとC++で違うってのが書いてたな。 コンパイラの違いだったかな
>>372 void *を他のポインタに代入するときのことだと思う。
char *p=(void *)0;とやるとC++ではエラー。だからmallocの戻り値も
キャストする必要がある。
あ、ごめんよ。void*にintとかを渡すって書いてあったな。 int *とか*がついてるもんだと思ってた。 そんな非常識なことはありえないと思って勝手に補完して読んでたらしい。 すまんすまん。確かにキャストが必要です。
>>368 gccか?
たしかgccではvoid *に対する演算が可能なように拡張されてるけど。
377 :
デフォルトの名無しさん :03/06/10 14:22
int int377[377];
378 :
デフォルトの名無しさん :03/06/10 15:59
c言語でπを求めたいのですが、いちばん簡単なプログラムは どうやって書くか教えてください!!
>>378 double pi = acos(-1);
381 :
デフォルトの名無しさん :03/06/10 16:05
一万桁まで求めたいです…
>383 それが(・∀・)イイ!
386 :
デフォルトの名無しさん :03/06/10 18:59
円周率で思い出したけどC++のint画型だけ大きさがCPUのビットを同じ記憶空間を とるんだよね!最近のは32bitだから4バイトだけと16bit機は2バイトになる事 知らなくて大変な思いをしましたね。C++はCの要領でプログラムするやつ多いから カプセル化していないのがいけないといったら、先輩に人のせいにするなと 怒られた。昔からずっと人のせいにするやつなんだよね俺!!!
387 :
デフォルトの名無しさん :03/06/10 19:00
独り言age
スレ違いなだけじゃなくて、意味も不明だな。
>>386 32 ビット機が出てすぐの頃、
というか MS-DOS の時代には
殆ど 16 ビットエミュレーションで動いてたので
int は 16 ビットが普通だったな。
今でも LSI-C 試食版は 16 ビットだな。
64 ビット機では int が 32 ビットになるかと言うと、
これまた複雑な問題があってだな、
int を 32 ビットだと仮定したプログラムが多いから
int は 32 ビットのままにするのが主流らしい。
ただ、64 ビットにするコンパイラもないことはないらしい。
int のサイズは規格では
「その環境で整数を表現するのに一番適当なもの」
と決められていて、別にレジスタサイズと決まってるわけではない。
「大きさがCPUのビットを同じ記憶空間をとる」 誰か↑の一文を日本語に訳して下さい。
>>390 例外処理は認められておりません
ただちに管理者に連絡してください
>>392 その誤解とは何か、理由付きで指摘しないと意味のないレスになる。
intはその環境で最も高速なものでなかったか?
int=32ビットで実装しても、あるときバージョンアップで16ビット整数の扱いが劇的に最適化されて 16ビット整数の方が速くなったら、int=16ビットに変更しないといけない。 なんてことになりかねないので速度だけで選ぶわけではないと思うが…。
char *str[] = { "one", "two", "three", }; とあったときに、 str をもとにして、文字列の数(3)を調べる方法はありますか?
397 :
デフォルトの名無しさん :03/06/11 07:48
>>396 要は配列strの要素数を得られればいいんでしょ?
sizeof str/sizeof str[0]
64bitCPUなのにintが32bitっていうのは 例によって過去の資産の絡みなんでしょうか?
399 :
デフォルトの名無しさん :03/06/11 07:57
そういう理由の場合もある。
400 :
デフォルトの名無しさん :03/06/11 07:58
高田社長が400ゲットだ! おらおら、おまえらうちの商品買えよ!
s/資産/遺産/
>>398 単にコンパイラ作ってるところの都合なだけだ。
>>399 素早いレスどうもです
よく使うintに64bit割り当ててもあまり得にならない
メモリの無駄遣いとも考えられますね
64bitが必要ならlonglongで宣言してるだろうし
longlongの処理を64bitCPU用に最適に
(1レジスタで処理するように)コンパイルできていれば
それで64bitコンパイラの役目は果たしているともいえるかも
>>402 int幅が変わると調整に手間がかかりそうですね
実装によってはライブラリの書き直しとか
テストもしないといけないだろうし
そんな後先考えない実装はしないと思うよ。
>>403 仮に int が 64 Bit になれば、
long は 64 Bit 以上になる。
long long は(ry
>>406 long >= int >= short
>>409 longのサイズは必ずしもintより大きくなければならないわけではないってことじゃないの?
う、
>>411 のネームランは無視してくれ、このスレでの番号じゃない。
なんで日本語って「>」に対応する単語が無いんだろう? 未満と以下は存在するのに...日本語の言語仕様のバグ?
超過? ちがうか・・・
より大きいすごく大きいもっと大きい超大きいすんげぇ大きいぼっけぇ大きい
ほう、ちょーか
>>415 英語にゃ「以上」や「以下」が無いがな。
大なり小なり
とりあえず「より大きい」といっとけば。単語じゃないけど。
void (*signal( int sig, void (*func) (int)))(int); この宣言文が一向に解読できない signal is function 〜謎〜 returning void 誰か教えれ
初めまして。今日からC言語始めようと思ってます。 んで、学ぶにあたって勉強するのにいい初心者用のわかりやすいC言語の本とかありますか? あったら情報教えてください。よろしくお願いします
>>424 戻り値の型 void (*) (int)
第一引数の型 int
第二引数の型 void (*) (int)
関数名 signal
第一仮引数の名前 sig
第二仮引数の名前 func
void (*) (int) を typedef して考えるとシンプルになる。
typedef void (*func_t)(int);
func_t signal(int sig, func_t func);
>>425 この板の一番上、ローカルルールの書いてあるあたりを参照。
「推薦図書・必読書スレ」へのリンクがある。
>>426 サンクス、よく分かった。あんた神
signalは戻り値が関数へのポインタで
引数にint型変数と関数へのポインタをとる
関数ということね・・・ややこしすぎ
430 :
C語初心者 :03/06/11 18:36
誰か暇なC言語マスターの方プログラムを作ってくださいな。 再帰を利用して迷路を解く。 外部変数 int position [9][9]={ {1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,1}, {1,0,1,1,1,1,0,1,1}, {1,0,0,0,0,1,0,0,1}, {1,1,1,1,0,1,1,0,1}, {1,0,0,0,0,1,0,0,1}, {1,1,0,1,1,0,1,1,1}, {1,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1}}; 上の迷路で"1"が壁で、"0"が通路です。 Startは(y,x)=(1,1) Goalは(y,x)=(7,7)です。 関数 int visit(int y,int x) を使ってください。 一度通った道には2を、解の道には3を入れてください。 で、最短距離の座標と , 壁を*、迷った所を?、解を0で表示する プログラムをお願いします。表示にはprintfをお願いします。
431 :
C語初心者 :03/06/11 18:40
すいませんスレ間違えました。
ポインタについていまいち理解できません。 オススメの解説ページみたいなのありますか?
>1
sighandler_tってのはGNUの拡張か。標準規格でも分かりやすいようにtypedefしておけばよかったのに。
signal()の戻り値=第2引数のシグナルハンドラへのポインタ でいいんすか?
436 :
デフォルトの名無しさん :03/06/11 20:41
>>430 基本情報処理の試験13年の秋か春に載ってるよ!
最近のC問題は迷路やもぐらたたきなどが出てくるようになった。
そろそろ「ねた」切れか?
int main(void){ char *a = "ABCDE"; char *b = "FGHIJK"; strcat(a, b); printf("%s\n", a); return(0); } これで実行時、エラーが出ちゃいます。 コンパイルは通るのですが・・・
>>437 ネタ決定
char *a = "ABCDE";をchar a[123456] = "ABCDE";に
439 :
デフォルトの名無しさん :03/06/11 21:02
>>438 なんでchar aをそんなにとるんだ。コンパイラによったらそれだけでえらーじゃん。
>>437 ちゃんとコンパイラ通るけど
#include <string.h>
#include <stdio.h>
int main(void){
char *a = "ABCDE";
char *b = "FGHIJK";
char *c='';
strcat(a, b);
printf("%s\n", a);
gets(c);
return(0);
}
で確認してみな!
先生、VC7のlimits.hで #define INT_MIN -2147483648 ではなく #define INT_MIN (-2147483647 - 1) って書いてあるのはなぜですか?
>>441 なんでだろうね。
負は正にくらべて範囲が一つ大きいですよって強調してるのかな?
・はじめは-2147483647と定義していた ・でもそれが間違いだと判明した ・修正担当者は引き算ができなくて、泣きながら-1を追加した というのが真相だろう。
それは規格違反。 −32767が正解。
445 :
デフォルトの名無しさん :03/06/11 21:30
>>444 INT_MINって規格上の最低じゃなくて、その処理系での最低だと思うけど。
だからこそわざわざマクロにしているんじゃないか。
446 :
デフォルトの名無しさん :03/06/11 21:32
VC++6.0でもintやlongは-1が付加されているね。でもcharやshortは-128や-32768になっている
448 :
デフォルトの名無しさん :03/06/11 21:38
>>439 > char *c='';
これじゃコンパイル通らないよ。空の文字ってのはエラー。
カッコつけて実行速度落としてるだけ! クソだよ、こんなの
450 :
デフォルトの名無しさん :03/06/11 21:40
下記の機能アルゴリズムを設計し,C言語により実装せよ. 「1.任意の個数のint型数値をコンソールより入力された順に保存する. 2.文字列"Sort"の入力により,入力された数値群を降順に並び替える. 3.最大値と最小値の平均値を計算し,2分探索法で検索する.」 設計指針 ・ソート部,探索部は,別のアルゴリズムを採用しても利用できるように設計/実装せよ. ・コンソール入力は,scanf()を使い,文字列,記号,整数値以外は,それぞれ別のエラーコードを返し, 入力を継続するようにせよ. ・メモリ節約のため,数値保存のためのメモリは動的に確保せよ.
ここは宿題スレではない
あ、カッコって ( ) じゃないのか。
455 :
デフォルトの名無しさん :03/06/11 21:48
>・メモリ節約のため ここが意味不明。入力データ数に制限がない以上、そっちの方が メモリ食う可能性があるんじゃないか。 >・コンソール入力は,scanf()を使い,文字列,記号,整数値以外は,それぞれ別のエラーコードを返し, 入力を継続するようにせよ. ここも意味不明。C言語・scanfでやる以上、「文字列」以外の入力は どうやったら可能なんだ。
ダメだね。 ニューメリックチェックと型チェックは別モノだから、エラーコードは別にすること。 ……ってか、ンなとこで早くも詰まってるの?か(w 本気でセンス無いぞ、それって…
459 :
デフォルトの名無しさん :03/06/11 21:57
>458 そうなんじゃないの?
ヒント: 予想される関数 main InputformConsole CheckValid CheckString StroreNums Sort Sort_quicksort Search Search_tree 仕様を増やしてもいいかな? ・画面への表示は1個所で行い、エラーの際もそこで表示すること。
457はCを使ったことがないんだと思う。
463 :
デフォルトの名無しさん :03/06/11 22:00
>460 > ・画面への表示は1個所で行い、エラーの際もそこで表示すること。 一箇所って意味ふめいだな
>>451 何がヒントだこのタコ。
お前の設計指針がタコタコすぎてんなもん作れねーんだよ。ぼけ。
何でもいいからエラーになる入力例挙げてみれ。
C言語において、scanfで「文字列」以外の入力がありえるのか?
465 :
デフォルトの名無しさん :03/06/11 22:02
わからんヤシだな。そんな親切な仕様はないっちゅうの。 ま、いいか。 例: >34 入力を受け付けました。 >34.5 小数は受け付けられません。 >Soort コマンド Soort は未定義です。 >#### コマンド #### は未定義です。 >Sort 並べ替えを行います。
>>465 それをscanfでやるの・・・?scanf("%s",s);かい?
>>441 #define INT_MIN ((int)(-2147483648))
じゃ結果が未定義だろ?
二分探索に二分木はイラン罠
>>473 二分探索と二分木探索は違うぞ。
> 探索部は,別のアルゴリズムを採用しても利用できるように設計/実装せよ
と言っているから他の方法(この場合は二分木探索)を示したんじゃない?
こういう依頼さ。 完璧と見せかけて罠があるコード書いたら面白いかも。
>>476 お節介にもつっこんじゃう人いるから巧妙にやらないといけないね。
待て待て。 >1.任意の個数のint型数値をコンソールより入力された順に保存する. と書いてあるのだから、 コンソールから入力するのは順番じゃないのか? 数値を入力するとは書かれてないぞ。 >2.文字列"Sort"の入力により,入力された数値群を降順に並び替える. となれば当然ここで言う数値群とは1の順序のことだな。 >3.最大値と最小値の平均値を計算し,2分探索法で検索する.」 でもそうすると、これもなんの最大値か判らないし、何を検索するのかわからないよな。
二分木探索じゃなくて 二分探索木じゃない?
パーマネントループ 入力してもらう if "Sort"だったら ソート関数を呼ぶ
途中で送信してしまった、鬱
パーマネントループ
入力してもらう
if "Sort"だったら
ソート関数を呼ぶ
else if 全部数字だったら
if intの範囲内の数字だったら
4バイトのメモリ確保
そこに数字を保存
else
コマンド [入力されたやつ] は未定義です。
ソート関数
適当にソートする。バブルソートでも使えば?(プ
…以上。
>>451 の通りに書いたので、無限ループです。
探索ってのはなにが起きた時にすればいいのかわからん。
インフィニットループの方がいいな。
無限循環のほうがいいな。
485 :
デフォルトの名無しさん :03/06/12 01:01
俺は思うんだが、文字列を整形することなく標準出力に表示する場合もprintfが使われることが多いな。 putsか、最後に改行しないならfputsを使うほうが、無駄が無くていいと思うんだが。
まあputsやfputsは%をそのまま書けるという利点はあるけど。。。
488 :
デフォルトの名無しさん :03/06/12 07:31
他スレからの転載です。教えて下さい ---- int foo (); みたいに、引数を省略した場合って(int)になるんだよね? この挙動って最新のC99で変わってる?
489 :
デフォルトの名無しさん :03/06/12 07:43
voidだろ?
>>488 つい最近その質問と答えを見た気がするんだが。
それともマルチか荒らしか?
492 :
デフォルトの名無しさん :03/06/12 07:49
493 :
デフォルトの名無しさん :03/06/12 07:49
495 :
デフォルトの名無しさん :03/06/12 07:51
http://www1.neweb.ne.jp/wb/prof/index.htm 平成15年度 自作板 PC環境調査
◆5月分の結果が出ました。現在は6月分に移行しています。
(参考)
平均年齢 25.4歳
ネット(2ch含) 78.7%
ゲーム 59.0%
Windows XP Family 46.9%
Windows 2000 Family 34.4%
Athlon 45.3%
Pentium 4 29.7%
nVIDIA 49.2%
ATI 28.9%
DVD-R/RW/マルチ 20.4%
CD-R/RW 75.9%
光ファイバー 8.3%
ADSL/xDSL 64.5%
CRT 74.6%
LCD 25.4%
496 :
デフォルトの名無しさん :03/06/12 07:53
>>496 レスを受け入れられないなら質問するなボケ
>>496 ここでも同じ奴が答えるという可能性は、微塵も思い浮かばなかなったのか?
つーか、最初からそう書けばいいのだよ。<正しいのか気になった
>>499 住人てあっちとこっちで結構重なってるよねえ。
特に答える側は。
switch文でcaseごとに変数に代入する値を代えることはできるんでしょうか?もしできるのでしたらその方法をお教えください。
意味がわからん
>>502 例えばこう言うことかな?
switch (value) {
case 0:
var = 3;
break;
case 1:
var = 2;
break;
default:
var = 0;
break;
}
私ならテーブルにしちゃうけど。
505 :
デフォルトの名無しさん :03/06/12 19:27
ですがなにか?
506 :
デフォルトの名無しさん :03/06/12 19:33
Cのプログラム実行時間を計るのには、どうしたらいいですか??
int table[3] = {3,2,0}; if(value>=3) var = table[2]; else var = table[value];
var=table[value>1?2:value];
>>506 bash なら ./hoge で実行せずに
time ./hoge で実行すれば。
512 :
デフォルトの名無しさん :03/06/13 01:43
教えてください。 以下のようにやったのですが は配列へのポインタの初期化がうまくいきません。 char (*ss)[10]={ "sunday", "monday", "tuesday", "wednesday"}; ポインタの配列が「行」の方向に任意の長さをとることができるから 配列へのポインタは「列」の方向に・・・ だと思ったのですが
513 :
デフォルトの名無しさん :03/06/13 01:45
>>512 char (*ss)[10]ってのは配列じゃなくてポインタだと思うけど。
あなたがやりたいのはchar *ss[10]では?
>>513 char *ss[10]は前に書いたように
2次元配列で「行」の方向に任意の長さをとることができる
のは理解できるのです。
しかしchar (*ss)[10]でも2次元配列をレイアウトすることが
出来るはずと考えてやったのです。
つまり
char (*ss)[10]はchar ss[][10]から書き換えられるのではないのか?
ということです。
>>514 {
"sunday",
"monday",
"tuesday",
"wednesday"};
はアドレスじゃないので
ss には代入できまへんえ。
516 :
デフォルトの名無しさん :03/06/13 02:28
char *str; のときに str = (char *)malloc(100); ってやる意味が分かりません。 str = malloc(100) これじゃだめですか? で、freeのほうも free((char *)str) にしなきゃならないとか free(str) でいいとか・・・ どなたかこの意味を教えていただけないでしょうか?
char *p; void *q; double *r; q = p; r = q; といううっかりミスを防止するため。
>>516 C だと必要ないが、C++ だと必要、というのが定番の答え。
>>515 ありがとうございます。
どうも勘違いしていたみたいです。
>>517-518 ありがとうございます、なんとなく分かりました。
ついでにもうひとつ聞いてもいいでしょうか?
struct port{
(構造体)
}
struct p *f;
f = (struct p *)malloc(sizeof(struct p));
としたとき
free((char *)f);
と型キャストしなければならないと書いてあったのですが、こっちはどういうことなんでしょうか?
連続で質問してすみませんが、お願いします。
>>519 C++だと必要なんですか覚えておきます。ありがとうございます。
free((char *)f)は嘘。もしくは古い処理系の場合でしょ。voidがなかったころはchar*で代用していたらしいから。でも古かったら引数チェックなんて行われないはずだけどなぁ・・・
>>524 >でも古かったら引数チェックなんて行われないはずだけどなぁ・・・
さすがにそれは古すぎ...
昔のBSD系が free(char*) で、
SYSTEM V系が free(void*) だったのだ。
んでANSIで free(void*) に統一される。
526 :
デフォルトの名無しさん :03/06/13 04:27
#include <stdio.h> char *str_copy(char *d, const char *s){ char *t = d; //A while(*d++ = *s++) ; return t; } int main(void){ char s1[128] = "ABCD"; char s2[128] = "EFGH"; printf("文字列s1:"); scanf("%s", s1); str_copy(s2, s1); puts("s1をs2のコピーしました。"); printf("s1 = \"%s\"\n", s1); printf("s2 = \"%s\"\n", s2); return 0; } 上のプログラムで、なぜ関数*str_copyに値を返す必要があるのかが分かりません。 void str_copy(・・・){、でやってみても実行結果は変わりません。 やはり何か理由があるのでしょうか? ちなみに望洋本の例題です。
あ、//Aってのは無視してください・・・
528 :
デフォルトの名無しさん :03/06/13 04:31
>>526 標準ライブラリのstrcpyと同じものにしたいからだろ。
>>528 なるほど、調べてみたら確かに一緒でした。
ありがとうございました!
>>526 それは標準ライブラリのstrcpyがそうしているから、それに習ったんだと思われ。
たとえばコピーした後の文字列の長さが知りたい時に、
str_copy(dst,src);
length = strlen(dst);
とやってもいいけど、str_copy() は dstをかえしているから、上は
length = strlen( str_copy(dst,src) );
という風にもかける。
531 :
デフォルトの名無しさん :03/06/13 04:43
char s1[1024]="ABC",*s2="DEF",*s3="GHI",*s4="JKL"; strcat(strcat(strcat(s1,s2),s3),s4); これでs1が"ABCDEFGHIJKL"になるってのがどこかにあったな。 こんな書き方するくらいならsprintf使った方がいいと思うけど・・・ sprintf(s1+3,"%s%s%s",s2,s3,s4);
532 :
デフォルトの名無しさん :03/06/13 04:48
>>526 char *t = d; でtにdの先頭アドレスがはいるにょ。
while(*d++ = *s++) でdにsの文字をコピーするにょ。このときdのポインタは
'\0'まですすんでるにょ。
return t; ここでtをdにしてしまうと。'\0'をかえすだけだにょ。
だからtの先頭アドレスはdの先頭アドレスをかえすにょ。
char *str_copy はtのアドレスをポインタとしてさしてるからdの先頭文字をさしてるにょ。
だから*str_copy だにょ
533 :
デフォルトの名無しさん :03/06/13 04:50
'\0'じゃなくて'\n'だったらごめんにょ
535 :
デフォルトの名無しさん :03/06/13 04:56
>>534 すまんにょ。
printfでchar *str_copyを直接読み出しているわけでなかったにょ。
だからreturnは別にいらなかったにょ。
こんなのもありか。 Cでやると違和感有るな。 char a[1234]; char *s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; char *p = s; while(strcpy(a,p++)[0]){printf("%s\n",a);}
537 :
デフォルトの名無しさん :03/06/13 07:32
違和感のない言語があるのか?
538 :
デフォルトの名無しさん :03/06/13 07:39
CScreenを使って → →→ →→→ →→→→ と一個ずつ増えるようにするにはどうすんの?
int map[10000][10000]; これやるとコンパイル通らないんだけどなんで?
542 :
デフォルトの名無しさん :03/06/13 08:00
>>541 Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
Fatal: Error detected (LME1514)
エラー読んでもわからないよ。
>>544 不親切なコンパイラだな。何使ってるの?
ちなみに
>>540 は「スタック領域のサイズ」について
調べてみなされ。
>>540 400MBものスタックを使える環境を用意しる。
>>540 そもそも、そんな巨大な変数を関数内で宣言しないでくれ・・・
externで確保してしまうとか・・・
mallocで一時的に確保してポインタでどうにかするとか・・・
ぐはぁ・・・
>>548 >extern で確保
400MB メモリが空いてないと起動できないぞ。
>malloc で確保
全部確保しないとどうしようもないんならそうせざるを得ないけど、
一度に全部確保しないでどうにかする道を探すのが正しい道だ。
map と書いてあるので RPG のマップのようなものだと考えると、
いくつかのブロックに分割して、
現在地近くのデータのみをメモリ上に置くようにする。
signal( SIGINT , signal_handler ) ; srand( time(NULL) ) ; for( i = 1 ; i <= 100 ; i++ ) { x = 1 + rand() % 50 ; if( x == 25 ) raise( SIGINT ) ; printf("%4d" , i ) ; if( i % 10 == 0 ) printf("\n") ; } signal()が2回目のシグナルを受信しないんですが 教えてくらはい
sigaction >>>>>(こえられない壁)>>>>> signal
553 :
デフォルトの名無しさん :03/06/13 15:21
cってベッドインだっけ
>>551 一回シグナルを受信して定義した関数にジャンプすると
2回目からから引数のハンドラへのポインタが自動的に
signal( SIGINT , SIG_DFL ) に再設定されてしまうつーことなんすかね?
556 :
デフォルトの名無しさん :03/06/13 16:10
2から数えて100万番目の素数を出来るだけ早く計算するプログラムを作りたいのですが、 どういう方法が一番早く計算できますか?
sizeof()を演算子と呼ぶことに抵抗があります。5Ωくらい。
>>559 () つけるから抵抗があるんじゃ。
() なんか無くてもほーら。
int a;
printf("%d\n", sizeof a);
ね?
型には括弧を付けないといけないけどね。
562 :
デフォルトの名無しさん :03/06/14 01:27
sizeofの返す値は定数と見てOKですよね?
>>562 sizeof の返す値は定数だけど、
プリプロセッサでは解析されないから
#if HOGE == sizeof (int)
というのは使えない。
case ラベルとか、静的変数の初期値とか、
そういうのには問題なく使える。
プリプロセッサでやっちゃう環境もあったけどよい子はマネしちゃダメだ
>>563 サンクス
配列の大きさ指定に使えるくらいだから定数なんじゃないかなぁと思っていたけど自信なかったです。
基本型の大きさを表す(標準の)マクロというのは存在しないんですよね。最大値や最小値を表すマクロならあるのに...条件付きコンパイルに使うようなものではないでしょうけど。
>>565 limitから換算して自分でマクロ作れ
ループの中で変数宣言するののどこが悪いの? アセンブラコード見たけどループの外においた場合と変わらなかったよ。
>>567 それだけじゃ何が言いたいのかわからん。
変数のスコープをなるべく小さく、という方針には適うが
初期化に時間がかかるような場合はループの外でやれないか考えることはある。
昔、漏れは当時の上司にループ内変数をとがめられたことがあるが、
よくよく話を聞いていると何のことはない、そいつが知らなかっただけのことだった。
きっちり反論できないようなら、上司に従っとけ。 それがいやなら勉強しろ。
変数の初期化に時間はかからないのでループ内におくべし。 以上。
ループの外に出さなければならない理由がないからループ内でFA。
初歩的なことだとは思いますが、質問させてください。 int main(void){ int i; float a=2.0,b=0.1; while(a<=3.0){ printf("a = %f\n", a); a+=b; } } このようなプログラムを組んでも、 a は 3.0 に到達せず、 2.9999……となってしまいます。 その理由は調べてみて理解できたのですが、確実に 3.0 まで処理させたい場合、 どのようなコードを書くのが一般的なんでしょうか。
int i; for(i=0; i<10; i++) printf("%f", 2.0+i/10.0);
>>573 わざわざありがとうございます。しかし言葉が足りなかったようで、
変数a と b 及び 3.0 は定数ではなく、scanf を使って読み込む形の場合を知りたかったのです。
つまり、下記コードにて、a 〜 c までを確実に処理したい、ということです。
勿論 b の値によっては a == c となることは有り得ないわけなんですが、
一例として a = 2.0, b = 0.1, c = 3.0 のとき、を出させていただきました。
int main(void){
float a,b,c;
printf("a -> ");
scanf("%f", &a);
printf("b -> ");
scanf("%f", &b);
printf("c -> ");
scanf("%f", &c);
while(a<=c){
printf("a = %f\n", a);
a+=b;
}
}
よろしく御願いします。
int n = (c - a) / b; for (i = 0; i <= n; ++i) { printf("a = %f\n", a + b * i); }
floatは使うな。
浮動小数点を使って ==, != という判定はしないのが普通。
いや、御法度
579 :
デフォルトの名無しさん :03/06/14 19:50
回答期待age
お答えくださった方々、ありがとうございました。 とりあえず今回は、四捨五入で数値(変数a)を補正していくという方法で解決させました。 色々やったせいで、40行程のソースが80行程まで膨れ上がってしまいましたが(汗)
こっちが折角温情かけてやってるのに(w 要求仕様が決まってない分は,何も突っ込まずに作ったほうが楽だってことを, 身をもって体験したいとは見上げた根性のコザルだな(w
583 :
デフォルトの名無しさん :03/06/14 23:06
>>582 Nが1ならな。でも1ってことはないと思うよ。
なぜ? 別に定数でないといけないということもないと思うけど。
>>582 > 0からN-1までの数を返そうとする
N==1,0から0までの...
ありえないね。
>>584 Nが1にならないように工夫しようとは思わないの?
ifで分岐するのが面倒
>>582 なら1文字足すだけで何も問題がない。
0から0までの乱数を求めようとするのが間違いだってば。
どうせNが0にならないようにしなければいけないんだから、ついでに1にもならないようにすればいいじゃない。
>>585 ,588
0 から 0 までの、ということは、
必ず 0 を返すというちゃんとした結果が定義できるので、
ありえないとか、間違いってことは無い。
定義できないのは、N が 0 の場合だ。
>>589 0の時は意味がないから別の処理になるが、
1の時も2以上と全く同じ処理をする場合、
わざわざ分岐させる必要ないだろ?
>>591 0の時は意味がないからってネタか?0では割れないからだろ。
意味がないのは1。
>>590 意味がないので(そういうことするのは)間違いだといったの。
>>582 のリンク先はNが定数として書いたんだと思うけどね。
でなければあんなまずいコードをC FAQに載せたりしないでしょ。
>>592 U付けるだけで何も問題ないのに、何故そんなに必死なんですか?
0 しか結果としてでてこないもののどこが乱数なのだろうか?
>>594 UつければNが0の時も問題が起きないんでしょうか。
>>596 今はN=1の話をしてるのに、なんで必死にN=0の話にすり替えようとするの?
命令の配列みたいなものを作りたいのですが、どうすればよろしいでしょうか。 int Get1(){return 1;} int Get2(){return 2;} int Get3(){return 3;} int GetList[] = { Get1();,Get2();,Get3();}; int list[3]; for(int i=0;i<3;i++) list[i] = GetList[i]; 本当はさらに #define INTLIST \ Get1();,\ Get2();,\ Get3();,\ int GetList[] ={INTLIST}; みたいなことをしたいのですが。 どうやらコールバック関数なるものを使うとうまくいきそうな きもするのですが、よくわからないのです。 よろしくお願いします。
>>597 「何も問題がない」というからでしょ。そもそもNが定数とは限らないなんて言い出すことが(以下略
>>598 int (*Getlist[])()={Get1,Get2,Get3};
こうかな。
あと、list[i] = GetList[i]();
600さん、ありがとうございます。 うまくいきそうなので実装してみます
>>602 int (*Getlist[])(void)={Get1,Get2,Get3};にしておいて。
でないと多分int Get4(int,char *)でも入れられてしまうと思うから
if(N>=2)とかif(N<=1)とするのが面倒?
>>604 じゃ、x/y とか x%y の計算をする場合、
y=1 の時は計算しなくても答がわかるからって別の処理にする?
voidを入れればいいのですね。 ところで、引数を使いたいばあい、 int GetInt(int i){return i*i;} int (*Getlist[])(void)={ GetInt,GetInt,GetInt }; list[i] = Getlist[i](2); みたいな感じにするんですか? list[i] = Getlist[i](i); こうやって2乗にした数字の配列を得たりするってことですか? それとも int (*Getlist[])(2)={ GetInt,GetInt,GetInt }; こうやるんですか?でもそうすると、宣言以降は 引数を変更できないですよね。
>>606 ]
Getlist[i]が関数名だと思って使えばいい。
引数を与えたいなら通常の関数と同じようにGetlist[i](3)とかGetlist[1](n)とする。
>>606 > int (*Getlist[])(void)={ GetInt,GetInt,GetInt };
voidじゃ引数がintのGetIntは入れられないって。その場合はint (*Getlist[])(int)={ GetInt,GetInt,GetInt };とする
typedef int (*GetInt_t)(int); GetInt_t Getlist[]={GetInt,GetInt,GetInt}; この方が読みやすそう
ていうか普通そう書く
611 :
デフォルトの名無しさん :03/06/15 00:41
なるほど、ありがとうございます。 (*Getlist[])(int) のように、2番目の括弧の中には引数の型をいれる のですね。typedefの使い方も教えて頂きありがとうございます。
613 :
デフォルトの名無しさん :03/06/15 05:06
初心者本を一冊、一通りやり終えました。 よくプログラミングを勉強するときは、ソースを沢山読んで 少し書いて、さらにソースを沢山読んで・・・もっとソースを・・・・ って表現がありますが、このレベルだとどのようなソースを読めばいいのでしょうか? お勧めありましたらお願いします
614 :
デフォルトの名無しさん :03/06/15 05:10
学校の教科書にrandが載ってないんだが・・・atoiとかも だめぽ?専門1年!先生が載ってないがrand教えたから、少し安心
616 :
デフォルトの名無しさん :03/06/15 05:11
CScreenを使って → →→ →→→ と一個ずつ→が増えるプログラムわかんね
>>617 結構有名な本だね。読んだことないけど。図書館にないから(ワラ
>>616 スレ違い。
かつ情報不足。
なにをやりたいのかわかんね。
>>617 615ってさ、610-611を皮肉ってるんだろw
>>620 ちげーよ ネタとして持って来るには一番だったからだ。
世の中にはこんなことしちゃう人もいるってことを(ry
622 :
デフォルトの名無しさん :03/06/15 10:21
「Uつけてsignedのオーバーフロー問題をunsigned で範囲を広げて」 というのは本質的な解決方法かどうか、特に引用元のような教科書的 記述で採用されるかどうか...。暗黙の型変換を利用するくらいならば 同じく引用元で最初に書かれている浮動小数点利用の方法がわかりやすい。 これならばN=1 でも問題はない。
揚げてまで粘着線せんでもいいだろう
typedef int GetInt_t(int); GetInt_t* Getlist[]={GetInt,GetInt,GetInt}; これってイクナイ?
関数ポインタは ***********************func(); とか書いても大丈夫
626 :
デフォルトの名無しさん :03/06/15 12:05
これもな (*********************printf)("ok");
ごるぁ♪>(^o^*)
>>625 それはちっとも大丈夫じゃないぞ。
***********************(func());
と同値だぞ。
629 :
デフォルトの名無しさん :03/06/15 17:35
doubleで定義した変数a、bがあって if(a==b){ ・ ・ ・ } てしたいんだけど、小数第二位までを比べる方法ってありますか?例えば a=1.23456 b=1.23789 でもifの中が実行されるように。
if (fabs(a - b) < 0.01) {
>>630 a=1.23456
b=1.24000
>>629 100倍して小数部を切り捨てるというのは?
633 :
デフォルトの名無しさん :03/06/15 18:01
漏れはCを始めて間もないです。独習Cを使ってます。 で、分からなくなったのですが、return 0;やreturn n; 、 return 10;などの解釈の仕方が分かりません。 どなたか説明してもらえないでしょうか?
>1
ところでどうしてC言語には 文字列型とクラスとガーベッジコレクションがないの?
文字列型 あるじゃん クラス 言語が古いから ガーベッジコレクション 必要ない
637 :
デフォルトの名無しさん :03/06/15 19:01
638 :
デフォルトの名無しさん :03/06/15 19:03
>>636 古いからねえw C99はどうする?
「ある言語」とCの差異をひとからげに欠点にしたがる
ゆんゆんピープルがこの時期は多いよな。
640 :
デフォルトの名無しさん :03/06/15 19:24
>>633 'return' は予約語です。その働きは決まっています。
「return;」あるいは「return なんとか;」と使って
教科書どおりの働きなんですが...。
慣れるまでしばし鵜呑みにするのもひとつの手ではあります。
教科書どおりの働きですか。 OSにプログラムを無事に終了することを伝えるってことですか? 普通のプログラムでは何も知らずにretorn 0;を使っていたのですが、 突然「return なんとか;」がでてきて焦ってしまいました
>>633 returnは値を返すって意味でいいんじゃない?
メイン関数終了時のreturn 0またはreturnはプログラムが
正常に終了したぜって意味だし。エラーは1だっけ。
うろ覚えですまん
643 :
デフォルトの名無しさん :03/06/15 19:43
>>641 returnの後ろなんて呼び出したところになんか返すんだから
自分で書いてる関数なんかは自分で決めるもんだろ?
return 0;ばかりで事足りてたならreturn;で十分だろ?
実際のOSだとreturnでエラーとか直接返すことなんてありえないぞ
本なんかの説明での論理的なOSだと値を返せたりするみたいだけど
return 0;しか知らないということはexternでグローバルな変数ばかり確保してるって事か・・・
>>636 > 文字列型 あるじゃん
ありません。
> ガーベッジコレクション 必要ない
C++でテンプレート駆使して同じようなことをやっているところを見ると
必要あるように思われますが?
>>643 そのレベルならexternも知らないだろうな。
647 :
デフォルトの名無しさん :03/06/15 20:08
>>644 ガベージコレクションはあると嬉しいよね。
現段階では言語仕様に含まれず、ライブラリでやるしかないけど。
なので完璧なガベージコレクションは望めないけどね。
でも実用上問題のないレベルではあるという話だ。
おれの経験でも問題なかったし。ま、使ったことがあるのはBohem GCだけだけどね。
言語仕様に盛り込まれるかどうかというと、永久にそれはないようなきもする。
文字列型もあれば嬉しいような気がするけど、そんな面倒でもないしな。
面倒だったらC++使っとけって感じだし、Cに欲しいとはあんまり思わない。
むしろCだったらソースの字面からアセンブリコードが透けて見えないといやなんで、
やっぱいらないかな、とも思う。
まぁ、今は作ったプログラムを直接実行しているだろうけど、 バッチやらperlやらから、実行した場合、mainの戻り値を受けることができるわけだ。 その戻り値で処理を分けたりしてな。、
●●●マスコミの「盗聴、盗撮」は許されるのか?その2●●●
http://natto.2ch.net/mass/kako/988/988402795.html 949 名前: 文責:名無しさん 投稿日: 2001/05/28(月) 18:46
>>916 直接の実行犯はわからなかった。ただし、その盗聴機関がマスメディア産業の
各方面につながっていることは確認済み。団体名なんか書く必要ないでしょ?
フジ・テレビとか読売新聞社とか電通とか...みんなが知ってるあの会社って
感じ。講談社の週刊誌(現代とかフライデイとか)が政治家の過去を暴露する記
事や写真をよく掲載するでしょ。あの手の記事は、盗聴/盗撮で得た情報で商売
をしている人達がいるという証拠。あういう人達に、オレの個人情報をつかまれ
ているんで非常に心配ですが、現状では、対抗策がない。
>>647 なるほど・・・
だが重大なことに気が付いた・・・
C言語がmainを基準に動いていたということをすっかり忘れていまそた・・・
>>652 「C言語がmainを基準に動いていた」とは知らなかった。
こういう意味不明で自分勝手な言葉遣いする新人がよくいるが
本当につかれる…。
はよ言えやー
誤爆スマソ
このスレ圧縮すると1/58くらいは小さくなりそうな気がする。
圧縮前 圧縮後 圧縮率 136824 . 43099 31%
658 :
デフォルトの名無しさん :03/06/15 21:09
#include <stdio.h> int main(void) { int num1=0,num2=0,a; printf("整数を入力してください\n"); printf("和または積を表示します\n"); printf("整数1");scanf("%d",&num1); printf("整数2");scanf("%d",num2); printf("1:和を表示 2:積を表示");scanf("%d",&a); if(a==1){ printf("%dと%dの和は%dです。",num1,num2,num1+num2); } else if(a==2){ printf("%dと%dの積は%dです。",num1,num2,num1*num2); } else{printf("はぁ!?");} getchar(); } Cを始めて2日目です。参考にしたいのでおかしいとこがあれば教えてください。
せめてまともに動くものをみせろよ
num2をscanfする際、&がついてないぞ。
662 :
デフォルトの名無しさん :03/06/15 21:12
はい、どこがダメなのか分からないんです。
0による初期化は必要ないのでは。
はぁ!? の出方が確率的だな
まぁ必要はないが、初期化する習慣をつけるのは悪いことじゃない。
int mainならちゃんとreturn 0;
return getchar();
668 :
デフォルトの名無しさん :03/06/15 21:18
>>663 グローバル変数は自動で0もしくはNULLに初期化されますが、ローカル変数は
初期化されません。main関数も例外ではありませんので初期化が必要です。
>int num1=0,num2=0,a; 初期化しなくてもいい気がするが、するならするでaもしてやれ。一貫性を持たせよう >printf("整数1");scanf("%d",&num1); 1行に2文かくのはあまり好きじゃないな。見にくいソースのもとだぞ。 >if文 swithにしたほうがいいんじゃ? >getchar(); if〜elseの外に出さないと。…って、elseの{}はその行のうちに閉じているのか。 そしたら最後の}が余計。コンパイルエラー。 現場ではよく「if文は中身が1行でも{}を記述すること」なんてコーディング規約があるぞ。
>>668 後にscanfで値を入れるんだから必要ない。
671 :
デフォルトの名無しさん :03/06/15 21:20
アンパサつけ忘れ。 \nもうちょっと入れてみ。 あと,mainの戻り値intなら,int返した方が落ち着かないかい?
>>669 > 1行に2文かくのはあまり好きじゃないな。
激しく同意 あとなるべくなら{の後も改行してほしい。
674 :
デフォルトの名無しさん :03/06/15 21:21
>>670 確かANSICで規格化されていたような気がしたが気のせいか???
>>668 変数を参照する前にその変数に何か値を代入するなら、
初期化しなくても大丈夫。
つまり、こんなプログラムは困っちゃうけど
int a;
a++;
printf("%d",a);
こんなのならOK。
int a;
a=1;
printf("%d",a);
>>672 スマソ、見落としてた…。
>>674 なにを言っている?
参照する前に代入などで値を入れるなら初期化は必要ないだろ。
もっとも、常に初期化するくせをつけるのは悪くないけど。
678 :
デフォルトの名無しさん :03/06/15 21:23
>現場ではよく「if文は中身が1行でも{}を記述すること」なんてコーディング規約があるぞ。 {}は書いてるじゃんか。 俺が言いたいのは「ちゃんと改行しないとわかりにくい」ってことだ。 たびたびスマソ
>>678 そうじゃなくて、ANSI Cで何が規格化されてるって?
初期化してない自動変数をscanfで使ったらあかんよってか?
682 :
デフォルトの名無しさん :03/06/15 21:25
そもそもscanf自体どうかと・・・
またわけのわからんことを
わかった! printf("整数2");scanf("%d",num2); これだ! num2を参照している。 ・・・・でもつっこむべきところが違うと思う。
>>677 最後の一行は、不定のまま使うなって話と微妙にベクトル違うね
アルゴリズム的が0は出てこないコードに=0と書きまくるガイキチには虫唾が走る
もしかして初期化しないと&で得られるアドレスも決まらないと思っているのかな・・・
688 :
デフォルトの名無しさん :03/06/15 21:28
変数の初期化範囲って よく見るとprintfの後ろにscanf("%d",&num1);がついてるよマジ 俺の会社でこんなん書いたら先輩と上司が飛んできて文句をひたすら いい続けるよ本当です。
自分の指摘がおかしいのを誤魔化すために、話題を逸らすのはやめてください。 自分の指摘がおかしいのを誤魔化すために、話題を逸らすのはやめてください。 自分の指摘がおかしいのを誤魔化すために、話題を逸らすのはやめてください。 自分の指摘がおかしいのを誤魔化すために、話題を逸らすのはやめてください。 自分の指摘がおかしいのを誤魔化すために、話題を逸らすのはやめてください。
訂正 誤: アルゴリズム的が 正: アルゴリズム的に
691 :
デフォルトの名無しさん :03/06/15 21:31
return 0; が入っていないよ。 javaならif elseのすべてに戻り値がないとコンパイルエラーですな
ゆんゆん
なんでそこでJavaがでてくるの? なんでそこでJavaがでてくるの? なんでそこでJavaがでてくるの?
おおい、何で盛り上がってんだ。
>>691 Java関係ないだろ。それはおいといても
「if elseのすべてに戻り値がない」なんていう状況か?
696 :
デフォルトの名無しさん :03/06/15 21:34
自分の指摘がおかしいのを誤魔化すために、話題を逸らしたいから。
満月だから。 そろって気を荒立ててるのだよ。
698 :
デフォルトの名無しさん :03/06/15 21:42
名言を思い出したyo >オブジェクト指向は全てそうなっている
名言といえばこれ。 >C言語がmainを基準に動いていたということをすっかり忘れていまそた・・・
701 :
デフォルトの名無しさん :03/06/15 21:51
俺様が701ゲットだ
じゃ702でいいや
668と674と688が激しく意味不明で今夜もグッスリ。
>>700 おれとしてはこれも捨てがたい
>636 名前:デフォルトの名無しさん 本日のレス 投稿日:03/06/15 18:49
>文字列型 あるじゃん
>クラス 言語が古いから
>ガーベッジコレクション 必要ない
memcpyって長さに0を指定したらどうなんの? 何もしないだけ?
するわけない memmoveはもちろん、strncpyでもなにもしないと思う。strncatなら'\0'をつけちゃうけど。
strncpy(dst,"",1024); dstを先頭から1024バイト分0で初期化する。
708 :
デフォルトの名無しさん :03/06/15 23:05
CとC++の違いなんでしょうか? 情報処理受けるので、今ボーランドのC++ですが、あまり変わらないでしょうか?
>>708 違う言語を比べるのは、いかがなものかと。
>>708 C++コンパイラなら、拡張子を.cにするか、オプションの指定でCコンパイラとして使えると思う。
>>708 C言語を拡張したのがC++です。
拡張長された機能により、C言語では実現の難しかったコーディングを可能にしています。
C++はC言語の仕様を内包しているので、C言語のプログラムをC+のコンパイラでコンパイルすることができます。
逆にC++のコンパイラでコンパイルできたからといってC言語として正しいとはいえません。
あくまでもC言語の範囲に仕様を限定してコンパイルしたい場合には
>>711 のようにしてください。
bccって拡張子を.cにするだけでC言語でコンパイルするっけ?
vcだとだめだよねたしか。
>>713 vcってのがVisual C++のことならそれでOKだけど・・・
ANSI Cのみなら/Zaをつけなければいけなかったかもしれないけど。
strncatでも'\0'をつけないな・・・・
思いっきり阿呆なこと言っていた。恥ずかしい・・・ catの方は'\0'を付加するということばかり考えていて"連結する"関数だということを忘れていた。。。
標準ライブラリで長さに0とか負数(intの場合)を指定したときの挙動って どうなってるの? if(sz > 0) then foo(p, sz); みたいにifではじく必要があるのかないのかが知りたいです。
>>718 thenって(w
基本的に標準ライブラリはガーベッジイン・ガーベッジアウトだと
思って使ったほうがいいよ。
strstrに渡す検索文字列の長さが0だとまずいんだったかな。
>>719 freeのようにNULLはOKと明示しているものだけ安全って事ですかね。
fopenもNULLを渡してよい仕様にしてほしかった。ラッパーを作れば済むけど。
fcloseだよ(´Д`;)
725 :
デフォルトの名無しさん :03/06/16 00:34
gcc の Wconversion オプションなのですが、よくわからないのでご教授お願いします。 int func(unsigned char c){ return 1;} main(){ unsigned char c = 1; func(c); } これで警告が出るのですが、どのように直せば、警告が消えるのでしょうか?
よくわからんが定数にU付ければいいんじゃない?1Uとか
(void)func(c); return 0;
int func(unsigned c){ return 1;}
729 :
デフォルトの名無しさん :03/06/16 00:51
どんな警告か書いて
main からの return 0; がない。
>>726 ,727
だめでした。
>>728 消えました。unsigned char は unsigned int に変換されてわたされるということなのでしょうか。
>>729 % gcc -Wconversion hoge.c
hoge.c: In function `main':
hoge.c:5: warinig: passing arg 1 of `func' with different width due to prototype
こんなんです。
>>730 すみません
int main(){
unsigned char c = 1;
func(c);
return 0;
}
こうでした。
732 :
デフォルトの名無しさん :03/06/16 01:02
関数は値をかえすべき(関数 main) って警告が出ます。なぜですか? #include <stdio.h> main() { printf("This is a test!"); }
>>732 Visual Studioとかだと、main関数の返り値が定義されていないと警告出て自動的に
void main() としてコンパイルされる。
それがいやなら、
void main(){
}
とコーディングするか、
int main(){
return 0;
}
とすればいい。
>>731 gcc なら main{}で警告でないよ。
できましたドモデス
-Wconversion プロトタイプの存在により引き起こされる引数の型変換が、 プロトタイプが存在しなかった場合 に同じ引数に対して行われるであろう変換と異なる場合に、 警告を出力します。 これには、 固定小数点から浮動小数点への変換やその逆の変換が含まれます。 また、 固定小数点引 数の大きさ(width)や符号の有無を変更する変換も、 それがデフォルトの拡張(promotion)と 同等である場合を除外して、 対象となります。 また、 負の整数定数式が暗黙のうちに無符号 の型に変換される場合にも、 警告が出力されます。 例えば、 xが無符号であると、 代入x = -1に対して警告が出力されます。 しかしその一方で、 (unsigned) -1のような明示的なキャ ストに対しては、 警告は出力されません。
引数の型の問題みたいだけど
>>725 がなんでダメなのかわからんな。
そんなオプションつかうな。
739 :
デフォルトの名無しさん :03/06/16 01:53
-Wallで十分
>>736 ありがとうございます。
でも(´・ω・`)ワカラン・・・
741 :
デフォルトの名無しさん :03/06/16 02:59
ポインターのポインターから作った二次元配列の初期化がmemsetではできないっぽいのですが どうすればよいのでしょうか? char **p; p=malloc(10*sizeof(char(*))); for(i=0;i<10;i++)p[i]=malloc(100*sizeof(char)); /* 何か代入する */ memset(p,0,sizeof(p)); これでは無理でした・・・
>>737 プロトタイプがなければ、charを受け取る関数というのは書けない。
>>734 -Wallにすると旧式な宣言は警告されるな
C++では合法なはずだが、それでも出る
>>741 p[i]の領域とってないじゃん。
ところで、何で二重ポインタが突然二次元配列って話に飛ぶんだ?
先輩か教官にそんなこと言うアフォがいるんなら、そいつはもう相手にするな。
添え字って*(mona + giko)をmona[giko]と書いてもよい、だけのことだよ。
プログラムの設計図をちゃんと作ってみろって!
そのコードがいかに無茶苦茶か浮き彫りになるから。
>p=malloc(10*sizeof(char(*))); 欝だ氏のう
746 :
デフォルトの名無しさん :03/06/16 03:22
>>741 0に初期化したいのならmemsetなんぞ使わずにmallocをcallocにすればいい。
ところで、sizeof(char)ってのは無意味だよ。
sizeofじゃmallocで確保したメモリのサイズは取れない memsetにpと渡してもポインタ配列の部分をゼロクリするだけで その先にある文字列格納メモリは個別にゼロクリが必要。 mallocと同数回のmemsetか、mallocの代わりにcallocな。
二次元配列なら char (*p)[100]; p=malloc(10*100); だと思うけど
>>745 ワラタ。おれ、744を見て「え? そうだったっけ?」って小一時間(うそ、小一秒間)、
コードを読み返しちゃったよw
あとなんだ、
memset(p,0,sizeof(p));
は、mallocしたサイズはとれないという突っ込みもあるが、
pの指してる先をfreeしてないのであればメモリリークするということも突っ込んでおこう。
# このsizeofとかの理解だとやってそうな気がする。
初歩的な質問で申し訳ありません。 現在、文字列の一部を置き換える関数の課題をしているのですが、 char型の関数を用意したのはいいものの、返り値がよく分かりません。 char strを返した場合、mainのところで出力する場合は ポインタとかを使えばいいのでしょうか。(´・ω・`)
751 :
デフォルトの名無しさん :03/06/16 04:30
>>750 他人はもっと分からないぞ。
課題にはなにを返せと書いてある?
えとですね、頭書きがchar *replace(char *s1, char *s2, char *s3){…}と なっていて、たとえばp=replace("tracter","act","imot")だったら、 pは"trimotor"と返すような関数なんです。 それで、関数自体はなんとか出来たのですが、返り値でつまづきました。 replace関数の所で配列strに文字列を格納したのでreturn (str);としたのですが、 出力がうまくいかないのです。(´・ω・`) replace関数の中で出力するのはうまく出来たのですが……。
>>741 >/* 何か代入する */
>memset(p,0,sizeof(p));
memset()で初期化出来るか出来ないか以前に
初期化を何の為に、何時するべきなのかを考えましょう
>>752 つまりこういうことか?
char *replace(char *s1, char *s2, char *s3) {
char str[STRSIZE];
/* いろいろやる */
return str;
}
もしこういうことをやってたとしたら、それはよろしくないぞ。初心者にありがちなミスだ。
配列strの有効な範囲は関数replaceの中だけだ。その関数を出たあとでは、
strは解放されちゃって使えなくなる。
一般に関数は自動変数(staticでないローカル変数)のアドレスを返しちゃいかん。
んで、何を返せばいいかだが…、その関数が何を返せばいいのかよくわからんので
答えようがない。
755 :
デフォルトの名無しさん :03/06/16 04:42
>>752 なるほど。その引数はまずいけどそれは置いておいて・・・
replace関数内でchar *str=s1;とやってstrをいじらずにreturn str;とすればOKなはずだよ。
ん?strは配列でそこにコピーするのか? それならstatic char str[SIZE];とすればいいんだけど・・・・
>>752 1 s1を直接書き換える
2 staticで用意してやる
3 char *replace ( char *dst, char *s1, char *s2, char *s3 ) ;
の様に、もう1つ増やしてdstに格納する
4 malloc()でstrのメモリを確保してやる
後は、自分が習った範囲で好きな方法で (かなり進められない方法もあるが)
>>756 うん。まあそうすれば一応解決は解決だけど使いづらい関数になるなw
なんかいろいろいじってたらできちゃいました。ごめんなさい(´・ω・`) ちなみにmain関数はこうなってます。 main(){ char *p; p=replace("tracter","act","imot"); while(*p!='\0'){ printf("%c",*p); p++; } printf("\n"); } でもポインタがよく分からないのでなんで出来たかもわかってません。
>while(*p!='\0'){ >printf("%c",*p); >p++; >} >printf("\n"); 嫌がらせ?
昔作ったやつ。多分処理は752とおなじだと思う。 malloc使うかバッファを関数使用者に用意させればもっと軽くなるんだけど・・・ char *strreplace(char *str,const char *seeks,const char *reps) { size_t seekslen,repslen; char *p=str; if(*seeks=='\0') return str; seekslen=strlen(seeks); repslen=strlen(reps); while(p=strstr(p,seeks)){ memmove(p+repslen,p+seekslen,strlen(p+seekslen)+1); memcpy(p,reps,repslen); } return str; }
>>760 さん
嫌がらせなんでしょうか……
>>755 さん
知らない文字がいっぱいです(´・ω・`)理解すらできません。
肝心なことを忘れてましたが、ライブラリ関数で使っていいのは
mallocだけだそうです。
>>761 文字列の置換て、溢れる可能性があるからディスティネーションの
サイズに気を使うから結構面倒だよね。
サイズが与えられない関数だったらstrlenの長さまでしか置換できないし。
>>762 malloc()を使うのならfree()は忘れずに
765 :
デフォルトの名無しさん :03/06/16 05:02
>>762 それを早くいってよ。
mallocで確保した領域に置換後の文字列を入れればいいの。
ただ、確保する量を考えるときにちょっと面倒かも。
s2の長さがs3の長さと同じか長ければs1分とればいいんだけど、s3の方がs2より長い場合は計算する必要がある。
s1の長さ+(s1に含まれるs2の数*s2とs3の長さの差)+1 これでOKだと思う。
766 :
デフォルトの名無しさん :03/06/16 05:04
>>763 そうなのよ。
>>761 はstrcpyみたいにかまわず書き込むタイプだから、置換後に長くなる場合は使用者がきちんと領域を確保していないといけない(^_^;)
勝手にマッチした文字列を全て置き換えると思ってしまったけど、
もしかして置き換えるのは一個だけでよい?
>>762
768 :
デフォルトの名無しさん :03/06/16 05:07
質問です C(VCやC++じゃない初期のC)で時計のプログラムを組むという初歩の プログラムをやってるんですがOSがwindows2000でエスケープシーケンスが使えません この場合解決策はありますでしょうか?
>>765 さん
ごめんなさい。ただ置換する文字列が複数個あったらその都度
置き換えるので、二個以上だと足りなくなるような……。
mallocで領域を増やせるのでしょうか。
というか宿題スレ別にあったのですね。すいませんでした〜
>>768 Win2000Proじゃ入っていないと思うけど、telnetサーバ立ち上げてTeraTermから。
>>769 領域はreallocで増やせるけど、先に計算して確保した方がいいと思うけどなぁ。
>>771 つか、mallocしか使っちゃダメとかいうんで、
今、自分でstrlenとかstrstrとか実装してたりするw
>>768 一応スレ違い。
Windows2000のコマンドプロンプトでエスケープシーケンスが
使えるかどうかということなんだろうけど、答は使えない。
Cygwinをインストールすれば、使えるようにはなるけど。
>>772 そういえばそうだw
>>769 というわけで増やすのは無理(か面倒)だw
それと宿題を代わりにやってくれというわけではないからここでOKだと思う。
>>768 16ビットを吐くコンパイラならANSI.SYSを組み込むことでエスケープシーケンスは使える。
レスありがとうございます 教えて貰ったものを試してダメだったらOS変えることにします スレ違い失礼しました(´・ω・`)
>>776 専用の関数群があったと思うけど
OSが提供するAPIなのか単なるライブラリなのかは知らないけど・・・
>>776 ていうか、コンパイラの名前くらいちゃんと書けと。
>>776 待て待て。Cygwinを使えばOSを変える必要はない。
インストールがちょっと手間だが、OSを変えるよりは手軽だ。
>>774 うむー、Cなんて久しく組んでなかったからどうもうまくいかん。
文字列の置換なんてRubyとかPerlでgsub一発でやってたもんな、最近。
堕落したもんだ。なわけで時間切れ、寝ます。
>>750 そういうわけだ、すまんな。
ではおやすみ
〜しか使っちゃいけない宿題って本当にあるのか? いやライブラリの同じ機能のものを使うのはマズイだろうけど、 mallocだけしかダメなんていう出題が本当にあるのかはなはだ疑問。 たんなる思い込みではないのだろうか?
∧_∧ ∧_∧ (・∀・ ) (・∀・ ) (⊃ つ (⊃ つ Y ,,ノ Y ,,ノ し ゝ_) し ゝ_) """"゙""""゙゙""""""""゙""""゙゙"""""""" ∧ ∧ アイーン アイーン ∧_∧ ∧_∧ ( ・∀・ )gets! ( ・∀・ )gets! (σ ,,σ (σ ,,σ (_,,l⌒l (_,,l⌒l (_) (_)
>>783 えらい昔のに反応するね。
getchar の返す値は EOF + 0〜255 だから
int じゃないと表現できない。
>>785 ×EOF + 0〜255
○EOFとunsigned charが取り得る全ての値
788 :
デフォルトの名無しさん :03/06/16 17:17
質問させて下さい。 void put_rstring(const char *st){ const char *temp = st; while(*st++) ; ・・・A if(st != temp) while(--st >= temp) putchar(*st); } 上の関数はscanfで受けた文字列を反対から表示する関数なんですが、 なぜか表示するときに半角スペースが入ります。(”SEC”と入力したら、” CES”みたいに) Aの部分を、 while(*st) st++; とすると入らないんですが、なぜでしょうか?
while(*st++) ; と while(*st) st++; の違いを考えましょう。
ヒント for( ; ; st++)
for文に直せるか直せないかの違いですか? うーん、ちょっとわかんないです・・・。
>>791 if ( *st++ );
if ( *st ) st++;
この違いと同じだ
あああわかりました! インクリメントする回数が前者は一回多くなってしまっているんですね。 ありがとうございました!
ヒント for(i=0; ;i++) iはいくつから処理される? いつインクリメントされる?
>>794 ありがとうございます!
評価される度にインクリメントされるのだから、
while(*st++)だと一回余計にインクリメントされるんですよね?
砂上の楼閣というか、底無し沼の上にビルを建ててるような雰囲気だな。
798 :
デフォルトの名無しさん :03/06/17 02:50
みんなプログラム組むときにフローチャートみたいな図とか何かしらメモ書いてる?
あ、スレ違いだ、すまん。
>>788 さんのプログラム走らせようとしたのですが、
segmentation faultとなってしまいます。
どう直したらいいでしょう。昨日、cをはじめたばかりの厨です。
#include <stdio.h>
#include <string.h>
void put_rstring(const char *string){
const char *temp = string;
while(*string++)
if(string != temp)
while(--string >= temp)
putchar(*string);
}
int main(void) {
char *st;
scanf("%s", &st);
put_rstring(st);
}
エー エフ オー
int main(void) { char string[25]; scanf("%s", &string); put_rstring(string); } こうにしたら、最初の1文字だけ出るようになりました。 全然reverseされてない。
じゃ、もう逝ってきま〜す
質問ッス voidへのポインタはC++だとキャストしないと 他のデータ型のポインタ変数に代入できないのに Cだとキャスト無しで代入できて、 問題なく代入したデータ型のポインタとして使えるんですか?
807 :
デフォルトの名無しさん :03/06/17 12:34
パイって定義されているのですか? 自分でdefineするしかないのですか?
808 :
デフォルトの名無しさん :03/06/17 12:38
math.hにある
809 :
デフォルトの名無しさん :03/06/17 12:43
>>806 書いてたしかめるべし。
たぶん、大丈夫だと思う。
こういうint a=(char*)sみたいのは
キャストしないとだめだが・・普通せんけど
>>806 C++は文法上の型チェックは厳しいッスからね
voidへのポインタってなに?
812 :
デフォルトの名無しさん :03/06/17 14:25
>>807 const double PI = 4*atan(1.0);
どうでもいいけど最近のコンパイラはgccもBCBにしてもsqrt(2)みたいに引数が
double型の関数に整数を書いてもきちんとキャストされるのね
>>812 #include <math.h>
const double PI = M_PI;
> どうでもいいけど最近のコンパイラはgccもBCBにしてもsqrt(2)みたいに引数が
> double型の関数に整数を書いてもきちんとキャストされるのね
プロトタイプ宣言以前のジジイハケーソ
M_PI は ANSI C 規格外のマクロだから、 コンパイラによっては使えない。 だから、 #ifndef M_PI #define M_PI 3.141592653589793 #endif と自分で定義する。
3.14159265358979323846264338327950288419716939937510208998628
printf()で「 " 」を出力するにはどうすればいいのでしょうか?
printf("\"");
ありがとうございました!!
これからCのプログラマになろうと思ってます。 今のところ独学で入門書3冊を読んだ後、K&Rの途中まで進んでいます。 けど現場のレベルが分からないもんでなんか不安です。 K&Rをだいたい理解出来ていれば現場に行っても大丈夫ですか?
何の現場? 職種によって必要な知識は千差万別でツ。
そんなもんは現場によります。
なかには
>>817 のような人が活躍中(?)の現場もあります。
貴方の脳味噌が優秀で現場が真っ当な所なら研修で必要最低限度のことは教えてくれます。
どうにも使えないようなレベルの人は真っ当な所なら落としてくれます。
駄目なところならマニュアルのカタカナ読むのを嫌がらないだけでも歓迎してくれます。
>>820 まずは就職してから聞きなよ(^_^;)
レスありがとうございました。 817のような人が活躍できるイメージが湧きませんが、 取りあえず就職頑張ってみます。
マ板で聞くべきことをここで聞くような人が活躍できるイメージというのも湧かないな。
あんまり気負いすぎると現場のレベルの低さに落胆すること請け合い。 糞不味いラーメンを一生作り続ける向上心ゼロのプロだっているわけで。
5月一杯でいなくなった奴が組んだソースを見たら、 保守性のかけらもなくてびっくりした。 シンプル イズ ベストなソースがかけて まとめるべきところはまとめられて 他と合わせるべきところは合わせられて 意味のあるコメントがかけて 人並みにホウレンソウができれば 普通にそれなりに活躍できると思われ。
他人のソースなど常に保守性のかけらもない
それはおまいにソースを読む力がないか コーディング規約をキチンと決めてないか 同僚に恵まれてないか のどれか
832 :
デフォルトの名無しさん :03/06/19 01:27
Cは死滅?
ていうかプログラマの教養課程
丸一日書き込みがなかったから
本当のことでも死滅なんて書いたらかわいそうだよ ここにはC言語くらいしか能が無くて 死滅したら食っていけない人が沢山いるんだから
C89 はいい加減古いことは事実だ。 じゃなきゃ C++ だの C99 だのなんて作らない。 しかし、COBOL や FORTRAN77 のように しつこく生き残ることも確かだろう。 (これらと比べるのは C がちょっと可愛そうだが)
過去の遺物を保守するような仕事はしたくねーな。
840 :
デフォルトの名無しさん :03/06/19 10:49
age
家電製品程度のマイコンなんかは、アセンブラ。 代替となりうる(なっている)のはCぐらいだろ。 C++は、なんか大げさだし。
842 :
デフォルトの名無しさん :03/06/19 11:42
size_t って何故必要なんでしょうか? unsigned long int じゃ駄目なんでしょうか?
だめです。
いいんだよ。
なりません。
ダメです、それは
848 :
デフォルトの名無しさん :03/06/19 12:20
>>842 typedefの役割をわかっていますか?
簡潔にだよ!簡潔に!わかっていますか!
(unsigned long int)この型を振り回したソースみてどう思う?
て、俺のソースだよ。
849 :
デフォルトの名無しさん :03/06/19 12:31
>>842 longがサイズを表すのに適切な型とは限らないから。
851 :
デフォルトの名無しさん :03/06/19 12:44
853 :
デフォルトの名無しさん :03/06/19 12:54
>>852 typedefの役割をわかっていますか?
型に意味のある名前をつけて分かりやすくするだけでなく、 環境によってその定義を変更してやることによって 移植性の高いコードを書く事もできる優れものだな。 FILE とか環境によって随分と定義が違ってるぜ。 尤も、特定の環境での定義に依存したコードを書いた途端 移植性が低くなってしまうがな。
型に無意味な名前を付けて偏見から開放されるだけでなく、 環境によって名前を変更してやることによって どの環境で書かれたか分かる優れものだな。
857 :
デフォルトの名無しさん :03/06/19 14:54
左辺値が必要(関数 main ) というコンパイルエラーがでるんですが、どうなんでしょうか? 何が原因でしょうか。 if(seisuu%2=1){ printf("ガクガク"); } この部分です
>if(seisuu%2=1){ なにこれ、なにがしたいの?
==
860 :
デフォルトの名無しさん :03/06/19 15:01
seisuuはユーザーが入力するようにするんです
>857 seisuu % 2 == 1 ご愁傷様です
代入してどうすんだよ
>>859 が書いたとおりif(seisuu % 2 == 1)だろ
代入と等号間違えるなよ
左辺値が必要なんですよ :-P
864 :
デフォルトの名無しさん :03/06/19 15:04
ガーン。 どうもありがとうござます
865 :
デフォルトの名無しさん :03/06/19 15:13
#include <stdio.h> int main() { int i,j; for(i=1;i<=9;i++){ for(j=1;j<=9;j++){ printf("%d ",i*j); if(j==9){ printf("\n"); } } } } これを実行して、縦の列をそろえたいんですが、 どこを工夫したらいいですか
printf("%d ",i*j);ここ
868 :
デフォルトの名無しさん :03/06/19 15:16
COBOLなら、オレに聞け!<2>
printf("%3d",i*j);
IPの隠し方教えてください
printf("%2d",i*j); putchar(j==9?'\n':' ');
I○
また未定義か
for(i = ...) { for(j = ...) { ... } putchar('\n'); }
875 :
デフォルトの名無しさん :03/06/19 23:02
>>870 IP隠れたら、インターネットできません。
ルーティングのお勉強しましょう。
876 :
デフォルトの名無しさん :03/06/19 23:30
何でA言語がないの?
877 :
デフォルトの名無しさん :03/06/19 23:33
>>876 それを言うんだったら、何でD〜Z言語がないの?
って、つっこんでみる。
879 :
デフォルトの名無しさん :03/06/19 23:38
C++を最初はD言語となずける予定だったがC言語がすばらしいのでそれに 敬意を表してC++になった。結構有名な話。ちなみにC++はANSIで1999年に 標準化されたとっても新しいものです。でも規格化以前から存在しいました。
何でGoogle使わないの?
C++作ったのってカーニハンらと同じくベル研究所の人なんだよね? つまり後輩が作ったということなのか
>>850 がいいこと言ったようだが
>>853 ,
>>854 ,
>>855 ,
>>856 は無視か
sizeof(unsigned long) < sizeof(void*)な環境で
size_tをどうtypedefする気なのか聞いて見たい
↑だけ空想論とかぬかすなよ、てめーら
びやーね すとらうすとるうぷ
>>882 そんな環境あるかよ。妄想もたいがいにしろ。
sizeof(unsigned long) > sizeof(void*)な環境ならあるが。
>>884 妄想? 自信があるなら、そんなに改行するなよ
>>884 初心者です。
例えば、どんな環境があるんですか?
こいつに聞いても無駄だよw
規格でどうのと言うくせに、今回は?? 移植性が聞いてあきれらあ
>>890 プレステ2はsizoef(long)==8なんだよ。覚えとけ。
おまえらホントバカな
で?
┐(´ー`)┌
まぁ、要するに、size_tと言うのは 主に、添え字として使用する時に使うべきものなので その必要な大きさは、ポインタの大きで十分であると… が、特定の環境等(どうしてもlongが128ビット必要とか)で unsigned long を、添え字として使用するには 無駄なので(上記例ではメモリが128ビット分あれば無駄と言う訳ではないが…) unsigned long int 等とはせずに、 その環境に応じて必要なサイズにすれば良いと言う事で… つーか、レスを読んでも、いまいち、論点が見えないんだけど、 一体、誰が、どう言う主張をしてるの?
ようするに、移植性を向上させるためってこと?
逆に下がるね。int使いな。
>>898 移植性と言うよりも
ただ単に、各々の環境で必要な分とすれば良いじゃないの?
って事だと思う (まぁ、いろいろと意見もあると思うけど…)
だいたい、移植性が問題なのなら "char" も "short" も "long" も
全てまとめて int 型の1つにしてしまえば良い(規格自体を)し
それぞれ、型が分かれているのは、それぞれの環境で
それぞれ最大限に資源を活用出来るようにする為だと思うので
"size_t" が決められていないのも、その一環なのだと思う…
移植性: ある変数のサイズを固定したい場合、 C の環境によって型のサイズが違っても良いという仕様は困る。 そこで、typedef した型名を使い、 環境によって定義を切り替えてやれば解決する。 また、環境によって構造体を使わないと実装できないか、 普通の型で十分実装できるか異なるものも、 typedef を使えば同じコードで処理できる。 単純化: 複雑な型名を短くできる。 例えば関数ポインタや配列ポインタの型名は複雑だが、 typedef してしまえば簡単な名前で扱う事が出来、 間違いを少なく、そして可読性も上げることができる。 実体を定義する時に構造体型や列挙子型の struct や enum を省略できるようにするのにも使える。
main() { /* ?@ */ scanf("%d", n); switch(n){ case 1: break; case 2: { while(1){ scanf("%d", m); switch(m){ case 1: break; case 2: break; /* ?A */ } } } } } こんな感じであって、switch(m)のcase2: の?Aから?@にいくようにするにはどうすればいいのでしょうか?
goto
>>902 ロジックを見なおす。
for example.
先ずmain()全体をループに入れ、
ネスト深すぎるから外のcase2のwhile辺りを関数化して、
中のcase2でフラグをセット。
main()に戻ったところでフラグがセットされていたらループ継続。
特定の条件が満たされたら最初からやり直す。 という処理はループよりgotoだろ。盲目的安置でもなければ。
>>902 switch(n) 以下を関数化し(例えば foo とする)、
do {
scanf("%d", &n); /* ← & も忘れずに! */
} while(!foo(n));
とし、foo はループを継続する場合(異常状態?)は 0 を、
ループを終了する場合(正常状態?)は 1 を返すようにする。
int i; int *n=&i; としているから&をつけなくてもいいんでつ。
なんじゃそりゃ。
>>907 それはウソだろう。switch(*n)と書いてないんだから。
ちっ・・・
911 :
デフォルトの名無しさん :03/06/20 13:33
ポインタってどうゆうもんすか?
* ← こういうの
← ↑むしろこれ
↓← →↑
↑ ← → ↓
( ・ )( ・ )
( ・ Y ・ )
なんか変な方向に向かっているような気が・・・
新キャラ C言語クン (・C・)
v(・∀・)
vc(・∀・)
vc(・∀・)++
C( ・∀・ #)
C(+^o^+)
高速にファイルをコピーするのには どんな方法が有りますか? apiを叩くのが一番早いのでしょうか?
ポートを叩くとかAPIを叩くという表現はやめてくれ
SMTPを喋る(w ていうか、OSや環境固有のAPIを話題にする時点でスレ違いだ罠
そもそもCと関係ない
931 :
デフォルトの名無しさん :03/06/20 15:45
このスレで言える事は、 1. バイナリモードで fread/fwrite を使って操作する 2. 丁度いいサイズでバッファリングする くらいのもんだ。
>>927 高速にファイルをコピーするライブラリ、ツールなどを探す。
934 :
デフォルトの名無しさん :03/06/20 16:40
一度出力した文字列や数値を画面上から消すことは可能ですか?
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
int i=10000; while(i--) puts("");
938 :
デフォルトの名無しさん :03/06/20 16:53
ありがとうございます。 では、特定の文字列だけとか指定は可能でしょうか。
バックスペースで消せる範囲なら バックスペースを表示すればいけることもある。 環境によっては変なのが表示されるけど。
>>928 何故ですか?なんか気持ち悪い?
>>929 そうですか、反省します。
>>932 バッファのサイズによっても変わるんですか
ちょっと調べてみます。
今なら新スレ立てられるけど、ちょっと早いかな。
943 :
デフォルトの名無しさん :03/06/20 20:09
ちょいと質問があるんじゃが ファイルに文字列を書き込みたいのだが Cではinsertで書き込む関数はないのか? たとえばファイルの中身が aaaa で書き込む文字列がbbbbだったとき aabbbbaaというふうにファイルを更新したいとき・・・
944 :
デフォルトの名無しさん :03/06/20 20:12
んなもんあるかい!
945 :
デフォルトの名無しさん :03/06/20 20:14
>>943 「Cでは」って、そんな機能のある言語ってあるの?
947 :
おしえてください :03/06/20 20:38
会社で、「そこは、getchar()を使って。」と言われました。 ワタシは、scanf()を使っていました。なぜそんな事をいわれたのか、不思議なんです。 普通の会社でも、そんなこといわれますか?私の上司がうるさかっただけなのですか? getcharって、関数でなく、マクロなのですか?
948 :
デフォルトの名無しさん :03/06/20 20:40
assert以外に必ずマクロってのはあったかな・・・・ is〜もまずマクロだろうけど、関数であってもいいと思うし。
getchar を使うべき状況で scanf を使っていたら注意されるでしょうね。 つーか scanf 使ってる時点で(
950 :
デフォルトの名無しさん :03/06/20 20:44
仕事でscanf使っちゃう人いるんだ。
>>947 つーか、scanf()を使ったら仕事にならんって。
このスレ、遡って読めば判ることだ。
或いはC-FAQにも出てたろ。
952 :
おしえてください :03/06/20 20:46
>>949 ワタシは、入社したてで、右も左も分からないです。
なんで、だめなのか、自分ではわからないのです。教えていただけませんか?
>つーか scanf 使ってる時点で(
↑の意味がちょっと分かりません。普通のCプログラムは、scanfみたいな、入門書に載っているような
関数は、馬鹿らしくて、使わないと言う意味なんでしょうか。。
953 :
デフォルトの名無しさん :03/06/20 20:48
新スレ立ててくる。 ちょっとタイトル変えるけど堪忍して。
>952 バッファーオーバーフロー
955 :
デフォルトの名無しさん :03/06/20 20:52
scanf("%100s"buf);
957 :
おしえてください :03/06/20 21:07
みなさん、どうもレスありがとうございます。 C−FAQみてきたら、載ってました。たしかに、バッファオーバーフローって かいてありました。何の事か、いまいちよく分からんのですが、使わないようにします。 getsも、使っちゃいけないと書いてありますね。入門書は、うそつきなのですね。こんな僕でも、これからやっていけるか、不安になってしまいました。
C言語は可変長データをサポートしていないから、 そういう関数も問題があると知っていても使わなき ゃならないんだよ。 それが嫌なら早くC++をおぼえろっつーこと。
gets や scanf は入門用のオモチャ関数。 仕事ではもっと安全な別の関数を使ってやりくりするが吉。
960 :
デフォルトの名無しさん :03/06/20 21:27
テーブルがずれているので調整
>>957 大丈夫。
今日は、scanfを使わないということを覚えましたよね。
物事は一歩一歩積み重ねて覚えていくものです。
がんばってください。
962 :
おしえてください :03/06/20 21:59
>>959 さん、
>>961 さん、どうもありがとうございます。
これからも、とりあえず、がんばっていこうと思います。
しかし、scanf()の代わりがgetchar()か? どんな職場だ。
>>963 getcharを使うべきところに、scanfを使うような奴がいる職場。
scanf("%d",&i)を取って代われる優れた関数の実例が言えるか?
fgets(buf, sizeof buf, stdin); i = atoi(buf);
bufの定義を書いてみろ
教えて欲しいんだけど、素直になれないから
>>968 scanfは使わない、を一般論と言うアフォを論破したい
たとえば961
早く答えろよ、bufの定義
入力された数字列がMAX-2文字って保証はどこにある
11分もかかってんじゃねーよタコ
「はにゃ〜ん」の定義を述べよ
>>975 入力された数字がiに収まる保証はどこにある
>>975 >>974 じゃないが、そうくると思った。
じゃあ、scanfは無限の長さの数字列読めるのか?
そういうのを考慮した場合、
scanfとfgetsとどちらが対処できるか考えればscanfを選ぶことはない。
>>978 そんなのは未定義でいいんだよ
atoiと同じロジックをトレースしてどこまで解析したかを返す関数とか書いてるのかてめーわ
>>979 別な話、無限の数字列を読むロジックは作ればできる
>>981 別に無限にしなくても限界がある。
1行が長すぎると同じ行を2回以上scanfしてしまう。
これにどうやって対処する?
scanf で数値入れるところで文字列入力すると 殆どの場合において暴走するけど、 それも再現しないといけないの?
>>982 >1行が長すぎると同じ行を2回以上scanfしてしまう。
は? もしかして、あの処理系の話か?
>>983 暴走してんのはてめーのアプリだ!
scanfはスペックを守っているに過ぎん
こういうアフォがscanfは使わないとか言ってるのを
聞くたびに耳が腐る思いだ
>>980 支離滅裂すぎ
入力されたものが確実に解析できる訳ではないのだから
どちらで、あっても問題はない
問題なのは、入力されてるデータが無限に続いた場合
プログラムで制御して、入力を打ち切れるか、制御出来ないかの差
>>986 確実に解析できなかった、その先で何をしているんだてめーの関数わ
もしかして、いちばん困ることをしでかしてくれるのか?
>>987 エラー返すに決まってんじゃん
つーか、ツッコミ所違うし
>>985 あんた素人でしょう?プロとしてアプリを作ることになれば、
嫌でもscanfを使うなって事が分かるよ。
>>990 いいやCでメシ食ってるよ
嫌でも憶えることは
ブツのスペックだ
>>992 止まったな…
まぁ、結論を言うと、そんな事を調べるより(scanf()が使えるかどうか)
scanf()を使わないようにした方か早いだろ?
素人だの結論だのと腰抜けばっかりだな このスレは
おおうおおうおおうおおうおおう
「フォーマットの正しくない入力に対する動作は未定義です」 としておけばいいってこと? 素敵な職場だね。
scanfなんか使ってられねえよ。。。 標準入力から入力する場合でも、入力用の関数とかつくらんか?
>>997 そういう仕様にしてるのがscanfの代用としてよく引き合いに出されるfgetsだろうが
1000ゲット♪
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。