1 :
v(^o^i)d :
04/04/10 20:42
2 :
デフォルトの名無しさん :04/04/10 20:43
3
typedefを使う意味を教えてください。 初心者には使う理由が見当たりません。
>>6 構造体を
struct MyStruct A,B;
とかでなく、
MyStruct A,B;
って感じで宣言できるようになることなど.
>>7 なるほど、構造体もありましたか
レスthx
>>1 > C言語なら俺俺に聞け! Part 75
これはわざとか?ともあれ乙。
>>10 いやコピペして番号を修正しただけ。
気づかなかった・・・
12 :
デフォルトの名無しさん :04/04/11 01:23
>>998 ただしい引数で関数を呼んでコンパイルエラーになったらたまらん。
>>998 なにがしたいのか良く分からんが。なんとなく sizeof(bar->hoge) と書いておく。
ちっとは進化しろ。
>memset(bar, '\0', sizeof(*bar)); >はOKということですか? Yes. これはメモリに展開しているhogehogeの先頭アドレスからsizeof(*bar)バイトに'\0'が代入される
>970 :デフォルトの名無しさん :04/04/11 00:39 memset(bar, '\0', sizeof(bar)); printf("bar->hogeの値は[%s]です。", bar->hoge); /* 初期化されてない */ >まず、以上のコードでは、Hoge型の変数hogeの内容は初期化されませんか? されます。sizeof(Hoge *)分だけ。 >sizeof(Hoge) >とすればよいのでしょうか? よい。 sprintf(bar->hoge, "%d", i); /* コピーされない */ printf("bar->hogeの値は[%s]です。", bar->hoge); >sprintfが反映されないのは何故でしょうか? 反映されるが何か?
16 :
デフォルトの名無しさん :04/04/11 05:13
はじめまして、私はC初心者です。 すみませんが教えてください。 C++5.5のコンパイラでC言語を打ちコンパイルすることは できますでしょうか?
C++をコンパイルできてCを理解できないコンパイラはないと思うが。てか C++5.5ってなに?BorlandC++と書かないとわからんぞ。
18 :
デフォルトの名無しさん :04/04/11 09:16
> C++をコンパイルできてCを理解できないコンパイラはないと思うが。 いっぱいありますよ。 C++をコンパイルできるくせに、Cの複合定数をエラーにしてしまったり、 拡張子を.cにしたとたん、関数の先頭以外のint i;をエラーにしてしまうような コンパイラーは「Cをコンパイルできる」とはいわないでしょ。 > C++5.5ってなに?BorlandC++と書かないとわからんぞ。 5.5というえばBorandのより有名なやつがありますね。そっちのことでしょう。
19 :
デフォルトの名無しさん :04/04/11 09:18
> C++5.5のコンパイラでC言語を打ち コンパイラーでは打つことはできませんね。 それに打つのは「C言語」ではないでしょう。
>>18 > 拡張子を.cにしたとたん、関数の先頭以外のint i;をエラーにしてしまうような
はぁ ? 当たり前だと思うが。
21 :
デフォルトの名無しさん :04/04/11 09:30
>>18 世間では C99 未対応というだけでは
「Cを理解できないコンパイラ」とは呼ばない。
23 :
デフォルトの名無しさん :04/04/11 09:35
>>18 > 拡張子を.cにしたとたん、関数の先頭以外のint i;をエラーにしてしまうような
それが普通ですが
24 :
デフォルトの名無しさん :04/04/11 09:41
>>22 言い出したら「Cを理解できるコンパイラ」は1つもないな
>Cを理解できるコンパイラ 何だかキモいコンパイラだな
26 :
デフォルトの名無しさん :04/04/11 10:08
>>20 >>23 こいつらぼけすぎ。
ちゃんとしたCコンパイラーは、関数の先頭じゃなくても
int i;できて当然! (うちのはちゃんとできる)
>>26 はぁ、"俺規格" 至上主義の方ですか。。。
28 :
デフォルトの名無しさん :04/04/11 10:21
>>27 俺規格でもC99でもなくてもブロック内変数は使えるが?
もう必死ですよ。
>>28 どんな内容であれ、その論拠が
うちのはちゃんとできる
では、俺規格と言われても仕方がないと思うが?
>>28 ブロック内変数をエラーにするコンパイラを教えてくれ。
32 :
デフォルトの名無しさん :04/04/11 11:15
グローバル変数しか使えなかったら使い物にならないなw
そんなボケた突っ込みをわざわざアゲて書くこともないだろうに...。
言い飽きたと思いながら、それでも口をついて 出てくる言葉…それが 「春だな」
int main(){ int a; for(int i = 0; i < 10; i++) /*C++で保証*/ ; int b;/*C++で保証*/ for(a = 0; a < 10; a++){ int x = 0/*CでもC++でも保証*/; x += a; } return 0; }
36 :
ビル・ジョブス :04/04/11 12:39
お久しぶり。今フィリピンに居ます。 C99で一番便利な機能拡張は可変個の引数を持つマクロが定義できるようになったことかな? 皆さんはどう思われますか?
>>36 引き数全体を括弧で括ればなんとかなるけどね。
で、ぼけぼけの>18はどこ行った?
>>36 それもいいけど、__func__ もね。
俺は可変長配列が一番ありがたいとオモタ。
42 :
デフォルトの名無しさん :04/04/11 14:23
引数はひとつでトークンが ";" で複数区切られていて それぞれのトークンを1行ずつ出力するプログラムをつくろうと下のようにしてみました。 #include <stdio.h> #include <string.h> int main(int argc, char *argv[]){ char buf[1024]; char *ptr; if(argc<=1){ fprintf(stderr, "argment error\n"); exit(-1); } strcpy(buf, argv[1]); if((ptr=strtok(buf, ";"))==NULL){ fprintf(stdout, "%s\n", buf); }else{ while(ptr!=NULL){ fprintf(stdout, "%s\n", ptr); ptr=strtok(NULL, " "); } } exit(0); }
43 :
デフォルトの名無しさん :04/04/11 14:25
> for (int i = 0; i < 10; i++) /*C++で保証*/ Cでも使えるだろうが > ぼけ
そうすると abc bash: cde: command not found bash: efg: command not found となっちゃいます。 どこが変なんですか?
45 :
デフォルトの名無しさん :04/04/11 14:27
> int b;/*C++で保証*/ 当然Cでも使える。通らないコンパイラーで「Cに対応している」とはいわん。
46 :
デフォルトの名無しさん :04/04/11 14:28
> if(argc<=1){ 空白あけろよぼけ。わざわざつめるな。 if (argc <= 1) { だろ
>42,44 悪いことはいわんからセミコロン ; ではなくコロン : でやってみて。
48 :
デフォルトの名無しさん :04/04/11 14:30
引数なしで起動したらargcがいくつになるか知ってる? 基礎からやりなし! っていうか、そもそもおまえはどんな本を読んで勉強したんだ。本の名前を書け。
>>44 多分
$ ./a.out abc;cde;efg
とかやってるんだろうな...。
bash について勉強した方がいいよ。
そのままでは、a.out には abc しか渡っていない。
あと、なんで二回目以降の strtok() 呼び出し時のデリミタが空白なんだ ?
51 :
デフォルトの名無しさん :04/04/11 14:49
printfを使わずにstdoutにfprintfか。ネタ決定だな。
52 :
デフォルトの名無しさん :04/04/11 14:57
でもまあ、いちいち指摘するほどのことでもない > 51
53 :
デフォルトの名無しさん :04/04/11 14:58
そこでコロンに仕様変更するのはダサい。 「;」が含まれるパラメーターの渡し方を教えるほうが正当。
そこで偽装セミコロンですよ、お父さん。
>>53 分かっていてからかっているんだろ。明らかにネタだしな。
56 :
デフォルトの名無しさん :04/04/11 14:59
そんなものはない > argment
57 :
デフォルトの名無しさん :04/04/11 15:00
>>55 いや、指摘するほうが知らなかったとみた。
58 :
デフォルトの名無しさん :04/04/11 15:01
>>57 知らなければセミコロンが問題だと分からないと思うが。
>>58 問題は知ってる奴が常に解決策を知ってるわけではないと思うが。
60 :
デフォルトの名無しさん :04/04/11 15:03
そもそもなんで strcpyするんだ? > ぼけ
61 :
デフォルトの名無しさん :04/04/11 15:05
>>60 argvが書き換え可能だと知らないからでは。
粘着だな
環境 CPUia32-eのマシン(AthlonAMD64) OSに、fedora core1(kernel2.4系) コンパイラgcc-3.3.2-1.x86_64 で、64bit版のCのソース書くことになったんだけど、 longが4バイト → 8バイトに変わる以外、何か 気をつけることってありますか?
65 :
デフォルトの名無しさん :04/04/11 15:36
C言語の埋め込みSQLを現在しているところを SELECT * FROM TBL WHERE A = :A; LIKEを使ったWHERE条件に変えたいんですが SELECT * FROM TBL WHERE A LIKE ':A%' としても動いてくれません。 埋め込みSQLでLIKE文は使えないんでしょうか?
>【3 件見つかりました】 すっげぇ。それいいな、何使ってンの?
>>67 OpenJane α 0.1.8.2
ログから検索で検索する。
タイトルしか出ないから、結果には手を加えているけどね。
普通にやると
-----------------------------------------
【SELECT * FROM TBL】の検索
PC等 [プログラム] C言語なら俺に聞け! Part 76 65
PC等 [プログラム] ***すれ立てるまでもない質問はここで 第53刷*** 123
PC等 [プログラム] C言語なら俺に聞け! Part 75 953
【3 件見つかりました】
-----------------------------------------
と言う感じ。
あと当然ながら、自分が見ていないスレは検索対象外となる。
無くても作れば良いやん・・・。
エッチ
71 :
デフォルトの名無しさん :04/04/11 16:34
>>61 こいつはぼけ。このコードでなんでargvを書き換える必要があるんだ?
もしかしてbufにコピーしたあとのbufやbufの指す内容に書き換えがあると
でも思ってるのか?
72 :
デフォルトの名無しさん :04/04/11 16:35
そんなものはない > C言語の埋め込みSQLを
>>71 strtok() の仕様も知らないで煽ってるつもりなのか ?
・・・・・・・・・・・・・・ぼけ ・・・・・・・・・・・・・・ぼけ ↑
int a,b=0; a=b++; でaに0が代入されるのはどうしてですか? ++演算子の方が優先順位(?)が高いから、 b++; a=b; と解釈されるんじゃないんですか?
>76 何のために 前置++ と後置++があるか分かってるか?
>>77 すいません。勉強不足なもので、
前置とかまだよく理解してませんです。。。
もうちょっといろいろ調べてみます。m(_ _)m
>>76 それを説明するのは難しいな・・・
「式の評価」と「副作用」は全く別の作業。
式が評価された "瞬間" に副作用が起こる訳ではない、
とでも言えば分かるかな?
単に temp = b; b = b +1; a = temp; と解釈されるだけのことだろ。(temp は、b と同じ型の一時的な変数。)
>>79 a=bもb++もただの式評価だと思うがどうよ?
後置++演算子は 変数の値を+1するが、 変更前の値を返す。 T increment(T* p){ T tmp = *p; ++*p; return tmp; } と同等。 T は 適当な数値型に読み変えること。
>++演算子の方が優先順位(?)が高い その通り。ただし b++ のように後置の ++ が付いた式の評価値は、 ++ する前の値であると決まってる。b自身の値が本当に ++ されて 1 になる(ことが保証される)のは ; の直後から。 b++ という式の評価値と、bそのものの値が変化する(副作用)とを 区別して考える必要がある。
87 :
デフォルトの名無しさん :04/04/11 21:13
returnで値を返すときreturn a, b;とか複数は無理なんですか? printf("%d %d", func()); int func(void) { int a, b; a = rand() % 10; b = rand() % 10; return a, b; } とやってみたんですけどbのほうが1900と表示されます
89 :
デフォルトの名無しさん :04/04/11 21:16
> すいません。勉強不足なもので、 っていうか何見て勉強してるんだよ。 本とか参考にしてるなら、その本の名前ぐらい言えよ!
90 :
デフォルトの名無しさん :04/04/11 21:19
>>87 2つ返してどうやって受け取るつもりだったんだろ ;)
カンマ演算子は便利ですが、こういう勘違いをしたやつが書いたコードが
たまたま文法エラーにならないのでおもしろい。
それはともかく2つ返したら3つ返したくなるのでは?
アドレス渡しの変数で返すのはつまんないし、
もしかするとそれはスタック構造にするべきコードなのかもしれんし、
はたまた、実は2つといってもxとyみたいな組の値だったらどう返すべきかわかるよね? (って
だれにきいてんだろ)
>>87 サンプルにrand()使って
>bのほうが1900と表示されます
と言われても困る。
>>76 優先順位と実行順序を混同してはならない
>>86 後置と単項は優先順位が異なっている
93 :
デフォルトの名無しさん :04/04/11 21:27
後置も単項だぞ > ぼけ
>>91 たぶんrand()は関係ない。
>printf("%d %d", func());
だってこれだもん↑
>>86 CFAQ3.2でも同じようなこと書いてあったから、
その通りだと思うんだけど、
> b自身の値が本当に ++ されて
> 1 になる(ことが保証される)のは ; の直後から。
b自身の値が更新されるのは、;以前のどこか、ってことになるよね。
すると、"b++"が評価されて、bの値がすぐ更新されてもおかしくない
と思うんだけどどう?
>>93 少なくとも優先順位の観点に於いて後置は単項ではない >真・ぼけ
>>82 はぁ ? じゃ、お前は一時変数使わんと説明してみな。
a=b b=b+1
>>95 > すると、"b++"が評価されて、bの値がすぐ更新されてもおかしくない
それでも、b++ の結果は +1 される前の b の値であることが処理系によって保証される。
と決まっているんだから、そう覚えろ。
>>95 おかしくないと思います。
; に至るまでの間に b に副作用が起こらなければならないので、
b が 1 になっていることが "保証される" のは ; 以降という
意味です。分かりにくかったかもしれません。
>>98 この話の流れの中でマジで書いてるのか ?
頼むからネタだと言ってくれ。
>>95 ところでお前、こういう文についてどう思う?
int i = 0, b[] = {1, 2, 3};
i++ = b[i++];
i には一体何が入っているべきなの?
何が入っていてもおかしくない
>102 代入できないエラー。おしいね、b[i++] = i++ なら動いたのに。
>>104 > おしいね、b[i++] = i++ なら動いたのに。
ばーか、動くわけねー
かも知れないよ。
おい、お前ら鼻から悪魔出てるぞ。
>>99 ,100
分かったサンクス。
> b++の結果〜
そういう決まりがちゃんとあったんだ。
struct gouman{ int x; int y; }; struct gouman func(void){ struct gouman a; a.x = rand() % 10; a.y = rand() % 10; return a; } どうしても2つ返したいなら構造体を使う手もある まあ普通は void func(int *a, int *b){ *a = rand() % 10; *b = rand() % 10; } だな。
前にも質問したのですが、理解できなかったので 質問させてもれいます。 main関数で最後にreturn 1と、0以外が返ると どうなるのか分かりやすく教えてください。
>>109 > return 1と、0以外が返ると
> どうなるのか
すみません、この辺りの日本語の意味が分かりません…
>109 exit() の引数に値を指定したのと同じことになる。 そのプログラムを起動した側が参照することができるかもしれない。 たとえばバッチファイルの ERRORLEVEL とか。
int main()としたときにいつも最後はreturn 0; と返してるところをreturn 1;のように返したらということです。
>>112 環境bashにおいて
mainの戻り値が0なら
echo $?
で0が出てくる。
mainの戻り値が1なら
echo $?
で1が出てくる。
114 :
デフォルトの名無しさん :04/04/11 23:20
>>112 そのプログラムをsystem関数で実行して戻り値を調べてみな。
環境によっては変わるから。
>>114 そういう時は胸に手を当てることからはじめる。
>>115 bashとか出してきている人もいるんだから環境依存なことを言ってもいいじゃん。
>>112 0以外を返すと警告が出る環境もある。
いずれにしても、環境依存だな。
>>116 その理屈で行くと、
「人を殺すヤツが居るんだから、オレも人を殺してもいいだろう」
って事になる。
そんな理屈が通ると思っているのか?
2を返すと電源OFFって環境もあるからびっくりだね。
>>112 main()からの戻り値をどのように使うかは使用するOSによって異なります。
例えば、あるOSでは戻り値が 0(retrun 0;)の時は正常終了、
戻り値が 0以外(return 1;等)の時は異常終了と見なされます。
この戻り値を一切無視するOSもあります。
UNIX系のOSではシェルスクリプトというプログラムを書くことで
この戻り値を使うことが出来ます。
MS-DOS(コマンドプロンプト)ではパッチというプログラムで
同じように使えます。
Windowsでも戻り値を返すことは出来ますが、
これを利用したプログラムを私は見たことがありません。
シェルスクリプトもバッチもCとは異なるプログラム言語ですので
後でこれら(あるいは貴方の使用しているOSでこれに相当する機能)
を学習するまでは「main関数は、return 0; で終わる」と覚えてお
けばいいと思います。
>>87 int *p=func();
printf("%d %d", *p, *(p+1));
int *func(void)
{
static int v[2];
v[0] = rand() % 10;
v[1] = rand() % 10;
return v;
}
でどう?
ポインタを使おうじゃないか(;´∀`)
126 :
デフォルトの名無しさん :04/04/12 01:37
っていうか改行しろよ。 プロンプトがつながるぞ ぼけ
128 :
デフォルトの名無しさん :04/04/12 07:24
>>124 staticならローカルでも、関数の戻り値にそのアドレスを与えられるものなの?
129 :
デフォルトの名無しさん :04/04/12 07:28
>>128 なんでautoだと駄目なのか調べてみれば分かる。
130 :
デフォルトの名無しさん :04/04/12 07:57
staticじゃなくても与えるだけならいくらでもできますね;) > returnでアドレス
131 :
デフォルトの名無しさん :04/04/12 10:22
ということにしたいのですね;)
int *p,*q; p=func(); printf("%d", p[0]); q=func(); printf("%d", p[0]); printf("%d", q[0]);
マルチスレッドにすると超こまるので、ふつー static 変数のアドレス なんて返しませんな。
134 :
デフォルトの名無しさん :04/04/12 11:50
133はある意味釣り
136 :
デフォルトの名無しさん :04/04/12 12:47
誰かこれを完成させてください。お願いします。 /* intbase.c Inputs and displays integer values in selected bases. - input bases are decimal, octal, hexadecimal. - display bases are decimal, octal, hexadecimal, and binary. */ #include <ctype.h> #include <stdio.h> #include <string.h> /* no other #include statements are allowed */ #define MAXCHARS 34 /* maximum length of value string, in chars */ /* enumeration constants to identify menu choices */ enum choice { enter, decimal, octal, hex, binary, quit }; /* prototypes for required functions. don't use printf, scanf, or other similar */ enum choice menu(void); int getInteger(void); void putDecimal(int value); void putOctal(int value); void putHex(int value); void putBinary(int value); /* optional: any other function prototypes */ /* implement main, followed by the other functions */
>1
>>136 丸投げイクナイ。てかプロトタイプしか定義してねぇじゃねえか。
完成させてくださいってより始めからから作ってくださいだろ。
int 数, 基数, 桁; char なんとか[] = "0123456789ABCDEF"; char 結果[]; while ( 数 ) { 結果[ その桁 ] = なんとか[ 数 % 基数 ]; 数 /= 基数; 桁++; } while ( 桁-- ) putchar( 結果[ 桁 ] ) ; のようなものが、いま読んでる本にかいてある。
>>138 プロトタイプは定義するもんじゃないよん。
家庭教師のCMのア・ガールとかいうアマかなりムカつくんだが
girlのエルの発音をちゃんとやってほしいな。あれじゃあエムだ。
>>136 釣りだとは思うが。。。
2進数表示以外はprintf()でできるダロ
ってprintf()は使うなってか・・・sprintf()もダメなのか?
それもダメならitoa()とかどうよ?
146 :
デフォルトの名無しさん :04/04/13 00:32
なんでprintfに2進表現がないんだろうね。あと定数の形式にも。
>>146 2進定数は0b〜でサポートしてる処理系があるみたいだね。
結構便利だと思うから標準でサポートして欲すぃ。
148 :
デフォルトの名無しさん :04/04/13 04:10
VC6.0使ってるんですけど double形 って union 出来ませんか?
「double型を共用体のメンバにできるか?」という質問なら 普通にできると思うけど
ソフトバンクの新C言語入門シニア編を使ってたんだけど 今度会社でC++を使う事になりました。 そこで同じソフトバンクの新C++言語入門を買おうとしたんだけど 上巻と下巻があって上巻はほとんどCと変わらないって話・・・ C言語版持ってる人間が上巻を買う必要あるんでしょうか?
>>150 本屋で立ち読み。
どうせ本屋にそれぞれ置いてあるだろうし、その場で比べてみたら?
154 :
デフォルトの名無しさん :04/04/13 13:37
えとー、fopenで"r+"でテキストファイルを開き、 1行読んで、必要ならばその内容を変えて、 そしてまたその行に書き込むということをやりたいのですが、 最初に書き込んであったバイト数より、変更後のデータが大きくなると、 次の行のデータの上に上書きされてしまいます。 これ、上書きではなくて、挿入みたいなことはできないんでしょうか?
155 :
デフォルトの名無しさん :04/04/13 14:01
>>154 できない。
メモリー上で操作して上書きしる。
>>155 そうですか・・・
じゃあ、元のデータよりバイト数が減るのは?
最初のテキストファイルの、データの後ろに、
変更後に増えるかもしれないバイト数分の空白を入れておいて、読み込み、
fprintfで変更後のデータ+改行を入れたら、きちんとなりますかね。
訊く前に試してみろと言われるかもしれませんが、
宿題の中のほんの一部なので、他にも色々やる事があって、ちょいと時間がないもので・・・
157 :
デフォルトの名無しさん :04/04/13 14:34
質問があります。 int main(void){ int y; char *x; のようであると、コンパイル通りません。しかし、文字型のポインタの 宣言を一番上で宣言するとコンパイル出来ます。 なぜなんでしょうか。
>>157 問題のソースのそのまま張ってみろ。
きっと何か頓珍漢な事やってるはずだ。
160 :
デフォルトの名無しさん :04/04/13 14:36
161 :
デフォルトの名無しさん :04/04/13 14:39
main(){ int y=0; char *x; scanf("%s",x); printf("%c\n",x[1]); printf(x); printf("%d",y); } すいません。コンパイルは出来ました。 これを実行すると、Segmentation faultになるところが 問題でした。なぜなんでしょう。
162 :
デフォルトの名無しさん :04/04/13 14:40
>>161 xは何を指しているのかな?
あとprintf(x);はやめてprintf("%s",x);にしな。
>>154 そういうことをやるなら
1つのファイルでやろうしないで、
読み込みファイルと書き込みファイルを分けた方がいいと思います。
例えば、
FILE* rfile=fopen(rfilename,"rb");
FILE* wfile=fopen(wfilename,"wb");
char rbuf[256];
char wbuf[512];
while(fgets(rbuf,sizeof(rbuf),rfile)!=NULL) {
//ここでrbufをwbufに良いように書き換え
fputs(wbuf,wfile);
}
fclose(rfile);
fclose(wfile);
とか。
セグメンテーションがフォールトしたから。
165 :
デフォルトの名無しさん :04/04/13 14:43
printf(x);はやめてprintf("%s",x);にしましたが、セグメンテーションがフォールトし ました。 xは、文字列を指すポインタです。
166 :
デフォルトの名無しさん :04/04/13 14:44
↑ネタ決定
167 :
デフォルトの名無しさん :04/04/13 14:45
>>165 言い換えるか。
xはどこを指しているのかな?
168 :
デフォルトの名無しさん :04/04/13 14:45
ネタじゃないって。まじで。 せぐめんてーしょんふぉるとってなんどすか?
>>158 うう、そうですか・・・ありがとうございます。
>>163 そうですね、やっぱりその方がいいかもです。
ただ、1回の実行時に、何回もその作業をやる可能性があるので、
(2回目のときは、1回目で変更した後のファイルをまた書き換える)
data1.txtとdata2.txtの2つを行き来(?)しなきゃだめですね・・・。
ありがとうございます、その方向でやってみます。
170 :
デフォルトの名無しさん :04/04/13 14:48
>>167 xは文字列が格納されてるメモリを指します。
Perlでもやってろ。
172 :
デフォルトの名無しさん :04/04/13 14:50
>>167 int y=0;
より早く、
char *x;
を宣言するとうまく行くんですがなぜなんでしょう
そのメモリはどこで確保してるんだハゲ
174 :
デフォルトの名無しさん :04/04/13 14:51
>>173 scanf("%s",x);
ここで。
xが示しているアドレスは、どこに確保されているんだ?
char x[256]; とでもやっておけば良いでしょう。
178 :
デフォルトの名無しさん :04/04/13 14:52
scanfにメモリーを確保する能力など無い。
179 :
デフォルトの名無しさん :04/04/13 14:58
>>175 確に確保されてないです。
たまたま、int y=0;消すとうまくいっただけなんですね
>>169 >ただ、1回の実行時に、何回もその作業をやる可能性があるので、
>(2回目のときは、1回目で変更した後のファイルをまた書き換える)
>data1.txtとdata2.txtの2つを行き来(?)しなきゃだめですね・・・。
まず、元の data1.txt を読み込み用にリネーム汁
んで、data1.txtを書き込みで上書け
ちなみにリネームはその名もrenameという関数でできる。
182 :
デフォルトの名無しさん :04/04/13 15:45
>>149 メンバには出来るけど
メモリは共有されないって事ですか?
doubleを何との共用体にするのかしらんけど、その値をどうするんだろうなという疑問。
共有はされるが、別の型で参照する意味が分からん。
>>180 おいおい、リネームしたヤシを削除するのを忘れるな(w
>184 きっと、longでアクセスしたらlong型になるとでも思っているんだ炉
>>182 なんでそういう疑問が?
メモリは共有される。
>>186 で、うまくゆかないからdoubleは共用体のメンバーに入れられないと思ったわけか。
共用体ってそういうものじゃないよ・・・
>>169 >ただ、1回の実行時に、何回もその作業をやる可能性があるので、
>(2回目のときは、1回目で変更した後のファイルをまた書き換える)
>data1.txtとdata2.txtの2つを行き来(?)しなきゃだめですね・・・。
>ありがとうございます、その方向でやってみます。
やるなとは言わないが・・・
最近のPCならそれなりのサイズのファイルでやっても十分速いんだろうなぁ
大量に行の挿入削除をやるのなら、メモリー上でリスト管理するのが正解。
それ以前に頻繁に書き換えるファイルをテキストファイルでやるなと(ry
>最近のPCならそれなりのサイズのファイルでやっても十分速いんだろうなぁ つーかむしろ大量のメモリを使用する方が最近のPC向きな気がする...
192 :
デフォルトの名無しさん :04/04/13 16:28
union { double d; long l; }; って共用体があって l に値を入れたら d の値は変化します?
>>192 変化はするが、その行為に意味があるとは思えない。
0を入れれば0にはなるな。 あと、浮動小数点フォーマットの構造を利用して ビットイメージレベルで高速近似演算する手法で使うこともあるけど(笑)
>>195 どっちに入れても 0 になるとは言い切れない。
>>196 まあ確かにdoubleがIEEE754かどうかも、longが同じサイズかどうかも、
内部表現が2進ベースかどうかも環境依存か。
198 :
デフォルトの名無しさん :04/04/13 16:55
俺の環境でもlに0を入れてもdは0にならなかったぞ。
longとdoubleのサイズが同じ処理系の方が珍しいかも ちゅーか、処理系依存だからならなくても不思議じゃないっちゃ
longは32bitを見かけるし、doubleは64bitが多いか。 longが64bitな処理系ったらAlpha Linuxとかの64bit処理系?
大きさがlongと同じfloatにしたら0になったね。
202 :
デフォルトの名無しさん :04/04/13 20:39
すいません、いまさらなんですが・・・ while文のwhileってなんて読むんですか? すごい恥ずかしい質問かもしれませんが 本当にわかんないんです。
中学英語じゃん
ぉわいぅ
ありがとうございました。 これでwhile文と口で言えるようになりました。 フォワイルかな
207 :
デフォルトの名無しさん :04/04/13 20:58
べたべたな質問でmemcmpの書き方おしえてほしいのですが こちらでよろしいですか?少し複雑なmemcmpでこまってます
memcmp()の使い方か? 作り方か?
>>208 レスありがとうございます。使い方で困っています
//最初なのでうまくいく
if (memcmp(ByteInBuff,"Username: ",10) >= 0)
AfxMessageBox("ユーザ問い合わせ表示判定成功");
//ここに間の処理がはいるが割愛
//次にここがうまくいかない
if (memcmp(ByteInBuff,"Password: ",10) >= 0)
AfxMessageBox("ユーザ問い合わせ表示判定成功");
なぜならByteInBuffには前回の"Username: "に今回分の"Password: "がマージされてしまうから
※並び順は安定した値に差異があるので比較バイトサイズを常にByteInBuffからリアルに
とらないと行けない
さてどうしたものが教えてください。
>なぜならByteInBuffには前回の"Username: "に今回分の"Password: "がマージされてしまうから ここがわからん。なぜ?
あー、なんだ。とりあえず何がしたいかから説明した方がいいぞ。 あと自分でもよくわかってない用語を使わない。
まず文字列の判定に何故memcmpを使う理由を説明せよ。
>>210 画面からの入力処理をバッファに記憶させてるのですが
またログに画面の表示内容をかき出す必要があるので改行コードも
含めてマージされたバッファ判定先に使っています。
>>211 最終的にバッファには
"Password: " 改行
ほにゃらら 改行
さらにほにゃらら 改行
"Password: " EOF
という具合になりこのバッファの"Password: "部分を
memcmpにより検索したいなと
>memcmpにより検索 もまえ strstr() って知ってるか?
>画面からの入力処理をバッファに記憶させてるのですが 画面は表示するためのものであって、入力装置ではない。
>>214 strstrは仕様によりここだけ使えないのです。おかしな話ですがセキュリティ面の仕様上の問題で
それとバッファの大元が構造体なので文字への変換等が複雑になるのを
避けるためです。(初心者がおおいので)
>>215 もうすこし説明するとエミュレーションを行うソフトなので
画面上の表示部をバッファにおいて制御してます
>strstrは仕様によりここだけ使えない んじゃ、strchr() だ(w '\n'を探せ
ひとまず家に帰宅します。1時間後くらいにまたきます
いちいち小出しにしないで、何がやりたいのか最初から最後まで一貫して説明しろ。
いまいちやりたいことがわからんが、ポインタ使っちゃ駄目なのか
セキュリティ面ってことは、・・終端文字を検索して処理するものは駄目ってこと?
いい暇つぶしになるからいーじゃん
あ、>223 は >220宛て
小出しにされると見当違いな回答を乱発させられるだけなので 両者にとって徒労感が漂う脳
>225 いーじゃん、暇つぶしになるから
227 :
デフォルトの名無しさん :04/04/13 21:36
説明できないようなセキュリティ規則じゃ余計危なそうだな
行単位の解析でいいなら、改行コードごと文字列を抽出して、 意味解析させればいいだけの話だと思うのだが、 なぜmemcmpが出てくるのか分からん。
229 :
E.T&rlo;ービナワ :04/04/13 21:39
皆さん、何歳ぐらいでC言語をやり始めましたか? ちょっと聞いてみたいだけです。 ちなみに僕は中3です。 今年の1月下旬に始めました。
230 :
AMPERSAND :04/04/13 21:40
ハンドル間違えた
もれ、Bから。 大学生になってから C した。
>>229 そういう話をすると、くだらない俺語りを始める奴が出るからやめてくれ。
おれ!おれだよ!おれ!
>>229 ム板とマ板が何故分かれているのか、
足りない脳味噌が焼き切れるまで考えてください。
クダラネー
236 :
デフォルトの名無しさん :04/04/13 21:52
ネタ、板とは関係の無い話題はご遠慮ください。
237 :
デフォルトの名無しさん :04/04/13 22:52
memmoveは領域が重なってててもだいじょぶらいしのですが、 memcpyやstrcpyはだめなんですか? 2つともだめなの?「後ろにずらす」のがだめなのは、とくにstrcpyではだめっぽいのは ありがちな実装をかんがえればわかるけど、前にずらすのもだめ(っていうか保証されてない)の?
238 :
デフォルトの名無しさん :04/04/13 22:53
保証されない
240 :
デフォルトの名無しさん :04/04/13 22:54
> while文のwhileってなんて読むんですか? 「while」って読みます。 わかりますか? もういっかい読みますよ「while」です。
すいません帰宅が遅くなりました。 小規模な開発なんですが顧客が多少 Cの知識を持っており←いつもこの手の人間が 仕様変更じゃなく設計変更だ!!といってきて足ひっぱります パスワードをソースでベタ書き処理とかを嫌っている理由から 単にログイン系処理はバイトやメモリ(もちろんポインタも可)を使うように 制限されているのです もっともあんまり意味ないのは100も承知なのですが ソースを見られてクジャグジャいわれると悲惨なので とりあえず基本のメモリコンペアに着目した次第であります。 要は積み重なるバイト型のバッファ全体をターゲットに『Password: 』の10バイト分 を検索しメッセージを表示できればOKなのですが この辺苦手なんですよ。そもそも 私はVB系とこってりMFCなVC専門なので
242 :
デフォルトの名無しさん :04/04/13 22:58
「入力してください」と表示して、キーボードから入力させたいのですが printf("入力してください"); scanf("%d",&hoge); として実行しても、先に入力待ちになってしまって 入力してから「入力してください」が表示されるんですけど、何故でしょうか?
>242 fflush(stdout)
244 :
デフォルトの名無しさん :04/04/13 23:15
>>242 別解
fprintf(stderr, "入力してください");
結局何がしたいのかよくわからん。
板違いかもしれませんが質問です 私はシステムエンジニア科という学科を学ぶのですが ここのC言語とは無関係ですか? 一応プログラム板を見てみたのですが、さっぱりです どの板を見ればよいか教えてください
247 :
デフォルトの名無しさん :04/04/13 23:26
>>246 辞めておいたほうが無難です。
本当にSEで食っていきたいなら 学校より
契約社員でどっか実務積むが吉ですよ。
勉強する気さえあれば学校で習わなくても 基本的な資格取得は可能です
この正解は実務と経験とセンスの有無できまります
だからそういう話はマ板に言ってやれ。 答える奴も同類。
249 :
デフォルトの名無しさん :04/04/13 23:38
>>248 正直スマンかった。新卒のこの手の人間が
すぐ辞めるし、意味不明にチーム全体につっかかって来る。
実力が期待できそうな奴も変な知識だけ身につけて無駄な時間を費やしてる
なんとなく救出してあげたいような そんなアドバイスをしてみたくなった
250 :
デフォルトの名無しさん :04/04/13 23:54
>>241 おまえへぼすぎ。
そんなコードかいてどうする。
251 :
デフォルトの名無しさん :04/04/13 23:55
>>247 学校次第だろ。まあたいはんの学校は役に立たないが。
>>241 >小規模な開発なんですが顧客が多少 Cの知識を持っており←いつもこの手の人間が
>仕様変更じゃなく設計変更だ!!といってきて足ひっぱります
藻前も同類じゃねぇか
>パスワードをソースでベタ書き処理とかを嫌っている理由から
>単にログイン系処理はバイトやメモリ(もちろんポインタも可)を使うように
>制限されているのです
ソース内には暗号化したパスワードで書いて、
それを復号して比較すれば問題ねぇだろボケ!
基本からやり直せ。
>>252 比較は「入力されたパスワードを暗号化して」ね。
>>247 ありがとうございます
もう学校の入学式を終えました・・・
そうですが・・・間違った道を進んでしまいましたか
まぁなるようになります
>>250 仕方ねえっす 顧客にはさからえませんし
自分のスキルの範囲で思い付くコーディングでなんとかしようと
>>252 それいわれると辛いっすね
ここのあなたたちに比べればウチは皆へっぽこすよ
技術が高度だから思わず会社から出入りしてしまうくらいですから
認めますよ
>ソース内には暗号化したパスワードで書いて、
>それを復号して比較すれば問題ねぇだろボケ!
>基本からやり直せ。
これくらいまで今日明日でBIGになれそうにないので
なんとかmemcmpで対応方とって伝授してくださらないですか?
>>255 スキルないならなおさら単純な方を使え
頭切り替えれ
そもそもmemcmpを使うこと自体に意味がないので、 対応法もへったくれもない。
嫌われていますねmemcmp
memcmp( ( strstr( buf, "password:" ) + 10 ), inputPassword )
が、0かどうかをチェックしろ
>>255
>>258 目的に合ってないだけ。
適材適所ってのを考えろ
>>259 すいません 上記の事情によりこの個所のコードにstrstr等の
文字が含まれるステップはまずいのです。
パスワード認証ってふつう一方向性ハッシュとか チャレンジ&レスポンスでやるんじゃなかったっけ。
>>260 バイト型宣言の変数を元に文字列制御演算子を使わないで
初級Cのノウハウを持っている顧客をだまくらかすには
他にどのような方法があるでしょうか?
色々暗号化等提案はあると思いますが、製造後でバグを出した時に
他の人でも解析可能にしたいのです(うちのチーム内で)
>単にログイン系処理はバイトやメモリ(もちろんポインタも可)を使うように >制限されているのです もっともあんまり意味ないのは100も承知なのですが あまり意味がないというより、全く意味がない。 そしてこれは理由ではなく、意味不明の戯言。 そんなに使いたくなければ、for文で回して字句解析すれば?
>>261 >if (memcmp(ByteInBuff,"Username: ",10) >= 0)
>AfxMessageBox("ユーザ問い合わせ表示判定成功");
ところで、これは比較が一致しなくてもメッセージボックスが出るが仕様か?
>>263 文字列制御演算しねえ。
言語は何?文字列制御演算子?
その人は「文字列制御演算子」は「危険だ」と思っていて、
「memcmp」は「安全だ」と思っているの?
>262 氏の書くような方法...たとえば、cryptとか、そゆのは
検討してみたか?
どうしてもごまかしたいなら、##を使ってはどうだろうか。
たとえば、s##t##r##s##t##rは、プリプロセッサによって
strstrに置き換わるよ。
>>263 strcmp()もmemcmp()も、やってることに大差ないことは理解しているか?
>製造後でバグを出した時に お前のレベルではバグを出す以前に、まともなプログラムにならない。 そんなものを客に出すつもりなら、これはもう詐欺だろ。 俺が客なら殴るよ。
>>265 一致した場合にのみメッセージを表示する仕様です。
会社帰りがけにmemcmpでF1押して出てきた説明みて解釈しました。
そもそも 私自身もmemcmpって殆ど使わないんですよ。
まったく同じだった場合 ==0
一部に該当文字が含まれてる場合>= 0
と認識してしまいましたが誤まりですか?
入れ食いだなw
>>263 禿同。
っていうか、
>他の人でも解析可能にしたい
のなら memcmp() なんて使わないべき。
>>269 誤り。
memcmpは"大小"を比較するんだよ。
>>269 というか、「一部に該当文字が含まれてる場合」に
ダイアログを出したかったの?
>>266 >その人は「文字列制御演算子」は「危険だ」と思っていて、
>「memcmp」は「安全だ」と思っているの?
多分その通りです。。。
>>267 それはじゅうにぶんに
>s##t##r##s##t##rは、プリプロセッサによって
>strstrに置き換わるよ。
これについては初めて耳にしました。一度調べて考えてみます。
275 :
デフォルトの名無しさん :04/04/14 00:29
ここで聞いていいかわからんが gccとかでコンパイルするときに オブジェクトとライブラリの違いがいまいちわからん 自分でつくったもの=オブジェクト 元からある物=ライブラリ という認識でいいの?
>>269 ByteInBuff に "X"だけ入れて実行してみ(w
>>275 いや、違う。自分でもライブラリは作れるし、
オブジェクトファイルの形で供給されるコードも存在した( はず)。
具体的にどう違うのかは、残念ながら俺は知らない...
(役立たずスマソ)
>>273 バッファ="Goodmorning" に
比較文字="Good"が存在した場合
メッセージ表示という解釈です。すいませんわかりづらい説明で
>>275 用語の使い方によって、字句が同一でも意味が異なる。
>>269 藻前、strcmp()も使えてないだろ
>>278 < 0 buf1 は buf2 より小さい。
0 buf1 と buf2 は等しい。
> 0 buf1 は buf2 より大きい。
どこをどう脳内変換したら、そういう解釈になるのか説明してくれ。
>>280 MFCとかのCString系ならばっちりなんですが。
仮に >一部に該当文字が含まれてる場合>= 0 としても一致してないじゃん。 しかもパスワード本体じゃない文字列になぜセキュリティかけたいのかがわか らん(しかもセキュリティになってないし)。これでパスが平文だったら元も 子もないよ。
>>279 どういうこと?
例えば
cc -o hoge moge.o hage.o -L/home/hoge/lib -lHoge.lib
というのがあったとき
cc -o hoge moge.o hage.o /home/hoge/lib/Hoge.lib
でも同じものができあがるの?
それともエラーが出る?
>>278 それはまさに strstr()。
memcmp() はメモリ内容の大小比較だ。
>>283 CString::Compare()も使える?
だったら、memcmpは、それに似てると思え。
>>283 >MFCとかのCString系ならばっちりなんですが。
(゚Д゚)ハァ?
>>287 サーチ(探す)
と
コンペア(比較)
という使い分けですね。
使ったことないから知らんがVisualCにプリプロセッサはないのか? てかCをどうやって覚えたんだ?
>>290 プリプロセッサが無きゃ、
プロトタイプ宣言がめんどくさすぎて死にます。
>MFCとかのCString系ならばっちりなんですが。 とりあえずCStringにデータが入っているという前提で、 必要なものを抽出するプログラムは書けると言うことか。 んじゃ、書いてみて。 もちろん、ばっちりだよね?
>>283 C も理解しないで何が
>MFCとかのCString系ならばっちりなんですが。
だよ。
正直、宿題スレみたいに、丸投げっぽくしてくれた方が楽だな。
>>292 ab=探す対象
CSring Str;
str.Format("abcdef");
if (strstr(str,"ab") != 0)
{
キター
}
こんな感じでしたっけ?
>>295 質問がマトモから離れれば離れる程レスが付くんですよ。
>>295 答えてあげるけど、
それはライブラリのディレクトリを間接的に指定しているか、
直接指定しているかの違いにしか見えないんだけど、
何がしたいのか意味不明。
>MFCとかのCString系ならばっちりなんですが。 と言っておいて >こんな感じでしたっけ? これはないだろう。
>>285 それ自作ライブラリでやったことあるけどエラー出なかったよ。
ばっちりも解釈が難しいですね
>>298 実行ファイルを作るときにオブジェクトとライブラリをがつんと
リンクして作ると思うけど
オブジェクトとライブラリの違いがよくわからん、というのが根本的な質問です
便利な汎用オブジェクトをまとめたのがライブラリってこと?
>>295 一応。どっちの書き方も合法なはず。
-lhogeは-Lで指定されたディレクトリも探しに逝く。
>ばっちりも解釈が難しいですね 「ばっちり聞きかじったことがあります」という解釈でよいか?
>>306 『この本があれば試験なんて―だ』
おおかたばっちりあってます
310 :
デフォルトの名無しさん :04/04/14 00:53
CとかC++でホムペ作りたいんだけど バイナリファイルを作った後は どうすれば良さげですか?
>>310 インターネットの基本から勉強し直せ。
そしてイタチガイ。
さてみなさん 明日はハードな展開が予想されそうなので そろそろsleepします。 いろいろ助言ありがとうございました。 ではでは
>>207 の脳内変換に障害があることが、
十分すぎるほどよく解った。
315 :
デフォルトの名無しさん :04/04/14 00:57
311、312>>レスありがとう
>>303 Unixの場合の例だが、オブジェクトファイルをアーカイブしたものがライブラリだ。
WindowsでもCygwinを使えば同じようにアーカイブされただけのライブラリを利用できる。
例えば、-lfoo と書くと、リンカは libfoo.a からシンボルを探してくるわけだ。
VCなどの、foo.libなどの形式も、本筋では余り変わっていない。
たしかに
>>207 のスキルではハードな展開になるのは避けられないだろうな。
Cどころかプログラムの基礎すら怪しいのに、 プログラムをネタに仕事するなよ。 こんな馬鹿に当たった客はたまったものじゃないぞ。
Cとかプログラム以前に日本語が(ry
結局誰も理解させられなかった訳か( ´ー`)
今までどうやって仕事してきたんだ?
>>285 環境に夜。
例えば前者だと使用しているオブジェクトのみがリンクされて
後者だとライブラリの内容全部がリンクされたりするかも試練。
お使いのシステムのマニュアルをよく読んで正しくご利用下さいってんだ。
こんなに自信満満に頓珍漢なこと言う新入社員もある意味凄いなぁ。
そもそもプログラマじゃなくてマネージャかなんかなんだけどSEが足りなくて
自分で組むはめになったのが
>>207 とか。
>>327 新人社員にセキュリティが重要な仕事はまわさないだろう
>>316 、325
どうもです
要はとくに意識しなくてもいいってことですかね?
自作オブジェクトとそのオブジェクトが使用している関数の
オブジェクトorライブラリのどちらかがリンクされていれば
問題ないってことなのかな
ちなみにリンクさせるとしたらその.soファイルと
ライブラリのどちらをリンクさせるのがいいのかな?
実行モジュールの大きさとか変わる?
.soはまた別の話だろ。ダイナミックリンク用だし。
333 :
デフォルトの名無しさん :04/04/14 01:13
>>207 strhoge() な関数のソースを *BSD あたりの libc から
こぴぺして myhoge() として定義し、それを使えば
ばれないぞ。」
#define memcmp strstr ってのはどうだ?
>>332 そうなのか・・・
同じソースから出来た.soと.slだったら同じじゃないの?
dllの拡張子 .so ---- UNIX .dll ---- Windows でおk?
>>336 UNIXは.slじゃないの?
HP-UXだけ?
338 :
デフォルトの名無しさん :04/04/14 01:22
.sl初めて知りますた
ってことは結局オブジェクトもライブラリも一緒だと ありがとうございました
Macだと.dylibだ
もれ、何度読んでも >241 が理解できん ↓ここが特にわからん。 >バイトやメモリ(もちろんポインタも可)を使うように制限されている 何を言ってるの? 「str〜系の関数が使えない」旨の書き込みがあったけど、その事? でも mem〜系の関数と同じだよね?
>>344 言ってる人も何言ってるかわかってないから気にすることないです。
>>344 MFC使いらしいので「バイト」というのは BYTE型の変数だと思われます。
その他は何言ってるか分かりません。
>>344 >パスワードをソースでベタ書き処理とかを嫌っている理由から
らしいんだが、そのパスワードをバイト(何のことだ?バッファ?)やメモリ
にどうやって読み込むんだろう。
そもそもメモリを使う以外にプログラムがデータを扱う方法なんてあるのか?
レジスタは使っちゃダメってこと?
>>347 たぶんメモリとかレジスタとか言っても何のことだか
>>207 には分からないんじゃない?
>>344 >何を言ってるの? 「str〜系の関数が使えない」旨の書き込みがあったけど、その事?
>でも mem〜系の関数と同じだよね?
(
>>263 より抜粋)
>バイト型宣言の変数を元に文字列制御演算子を使わないで
>初級Cのノウハウを持っている顧客をだまくらかすには
>他にどのような方法があるでしょうか?
↑から推測するに、
>>207 は
「この顧客は c = '0'と c = 48 の区別がつかない」('0'==48と仮定)
と思っている。
だから、char str[] = "0123"; を
typedef char BYTE;
BYTE str[] = { 48, 49, 50, 51, 0 };
として文字列をベタ書きしていないかのように見せかけたい。
(こんなことで顧客がだまされるとはオレには思えないが)
文字列を使ってないってことにしてるんだからstr〜系の関数は使えない。
ということじゃないかな。
>>348 なんとなくわかった。char を避けたいんだな。
ってforでまわせば済む話じゃん…しかもセキュリティ上がってないし。
意味のないことを苦労してやろうとしてるのか。
そしてこれだけ混乱させといて本人は帰ってこないヨカーン。
とんだ天然太公望でつね。
そして>207は客を見下してる積もりで恥をかくわけだな。
351 :
デフォルトの名無しさん :04/04/14 07:40
> その人は「文字列制御演算子」は「危険だ」と思っていて、 > 「memcmp」は「安全だ」と思っているの? 昔からのCobolerとか、昔からの制御屋とかにかぎらず、 その手の大規模ソフトウェアの開発者はstrほげほげを嫌うんですよ。 '\0'さがしてどこまでもぐるぐる回っちゃうので、バグがでたときに、ハデなので。 でも、memsetやmemcpyだって引数まちがえりゃバグがでることは同じなので、 ようはstr系を怖がるやつってのは「バグはどこかにあるはず」「少しぐらいバグが あっても見つからなきゃOK」って思ってるんですよ。本音では。逆に言うと、 「バグをなくすことは不可能なんだから、自分が担当しているうちにハデなのが でなければOK」「ユーザーから目立つバグを言わると責任が重いのでイヤ」って のが頭にあるんです。 これは20年ぐらい前から同じ傾向ですね。気をつけるべきなのは「str系をこわがって mem系なら大丈夫」だと考えているやつと同じプロジェクトで仕事すると、バグを 入れ込むのはそいつら、だということです。
352 :
デフォルトの名無しさん :04/04/14 07:43
>>316 > Unixの場合の例だが、オブジェクトファイルをアーカイブしたものがライブラリだ。
> VCなどの、foo.libなどの形式も、本筋では余り変わっていない。
「本筋では」なんて書くのはよくわかってない証拠。実際には「本筋では」どころか
まったく代わりはない。
ちがうのは、アーカイヴの形式がちがうだけ。
古いUnixではarでアーカイヴするが、
MS-DOS系では、古くはlibでアーカイブしてただけ。
前者はテキストでもバイナリーでも汎用で、後者はオブジェクトファイル専用に
使うことが多いこと、形式がそれぞれ独自なこと、前者はアーカイヴァー、後者は
ライブラリアンと呼ばれること、ぐらいの差しかない。あとはまったく同じ。
353 :
デフォルトの名無しさん :04/04/14 07:47
>>351 str系を嫌って、mem系を安全だという妄想を持ってるやつって、それだけの理由(壊れたときハデ)ではない。
まず、strcpyではナル文字までコピーするのにstrncpyではしないとか、
そのへんがむずかしくて理解できないらしい。
あとは、memcpyだけじゃなくて、領域が重なっててもだいじょぶなmemmoveがあるのに
str系ではそれができない、というのも理由の1つらしい。
わたしはstr系キライじゃないので、両方つかいます。
>まず、strcpyではナル文字までコピーするのにstrncpyではしないとか、 >そのへんがむずかしくて理解できないらしい。 これはマジですか?知らないやつが使ったらmem系の関数の方が危険じゃん。
355 :
デフォルトの名無しさん :04/04/14 08:13
mem系は、「いちおうアセンブラ的にコンピューターは理解できているが、Cにはなれていない」 人でも使えるからですね。だからそっちを好むぼけが多い現場がいまだにいっぱいある。 で、そういう人間は、たとえば、いろんなフラグを1つのバイトやワードに まとめてあるときに、0x04とandとって、0x40と比較する、なんてコード 書く傾向があります(もちろん#defineぐらいはしてますが)。 Cのユーザーだともっと便利にやるのに、その方がアセンブラ的に理解しやすいから らしい。
スクリプト厨とかVB厨ってのはよくみかけるけど反対方面にも似たような種類 の集団があるんですね。
357 :
デフォルトの名無しさん :04/04/14 08:22
358 :
デフォルトの名無しさん :04/04/14 08:22
そういう集団を「判別」するのにも使えるわけです。 o str系きらってmem系つかいたがらないか? o 1行でも中括弧「{}」つけろというコーディング規約にこだわってないか? あたりですね。これらは同じ集団にみられます。 そういうやつって、そのくせ、カッコの内側はあけて、2項演算子の両側はつめるんだよね。 カンマなんか右側をつめて、左側をあけてたりもする。 で、ifやwhileの後ろは空白をつめ、関数名の前はあける... あ、セミコロンの前をあけたがる傾向もある。
359 :
デフォルトの名無しさん :04/04/14 08:26
その点、Unix系で育ってからそういう現場に出たひとはまともなのが多い。 str系も適切に使い、適切に避けることができる。 バグを避けるという大義名分で行われる「均一化」(その実は、一番レヴェルの低いやつ にあわせる)は、実はバグを大量に発生させてるわけなんだけど、そのことに気づいて いなかったり、気づいていても直せない(何か前例のないことをやって責任を負わされる のをいやがる)ってのは、ここ30年ほど続いているこの業界の悪習なんです。 Cなんかできる以前から続いている体質(悪習)なので、Cが世の中に普及してからも ちっともかわっていません。わたしが30年前に現場に出たときと同じ。 全国各地の、数百人規模の現場から数人規模の現場まであらゆる体験をしましたが、 そういう悪い習癖はかなりの確率で存在してますねえ。
361 :
デフォルトの名無しさん :04/04/14 08:31
>>357 Cのbitフィールドつかえってことだろ! それぐらいおれでもわかったぞ。
#define MASK_I_FOOBAR 0x04
#define MASK_I_BARFOO 0x10
...とか30個ぐらいあって、
else if ((foo & MASK_I_FOOBAR) == MASK_I_FOOBAR)
func(a);
else if ((foo & MASK_I_BARFOO) == MASK_I_FOOBAR)
...なんて書いてもコンパイラーはエラー出してくれないんですよ! (あたりまえ)
1bitなら、シフトする方法もつかえるが、まあ2bit以上の場合もかんがえれば、
andとって比較だろうな。
で、1bitの場合なんかは、bitフィールドつかったときの効果が大きい
(すごくみやすくなる)
> そういうやつって、そのくせ、カッコの内側はあけて、2項演算子の両側はつめるんだよね。 > カンマなんか右側をつめて、左側をあけてたりもする。 > で、ifやwhileの後ろは空白をつめ、関数名の前はあける... > > あ、セミコロンの前をあけたがる傾向もある。 みたことないけど読みづらそう。 for( i=0 ;i<10 ;i++ ) { memcpy ( str1 ,str2 ,10 ); } こんなかんじ?
363 :
デフォルトの名無しさん :04/04/14 08:34
>>361 ハァ?
>>355 の「0x04とandとって、0x40と比較する」に対して言っているんだが。
0x04とandをとったものは常に0か4だろ。それを0x40と比較してどうするんだよ。
355がいっているのはビットフィールドじゃなくて、if(foo&MASK_I_FOOBAR)のことじゃないだろうか。
マ板向きの変な長文オヤジが入ってきたな。
>>351 >その手の大規模ソフトウェアの開発者はstrほげほげを嫌うんですよ。
>'\0'さがしてどこまでもぐるぐる回っちゃうので、バグがでたときに、ハデなので。
例えmem〜()を使っても、文字列系の処理をするためには
'\0'を探さないとstr〜()系の処理は実現出来ない訳だが。
そうなると、さらにやっかいなバグを出す事になる事必死だろう。
# その程度の香具師らではな
なんか妙な拘りがあるんだろうけど、TPOを弁えない時点で自分が能無しに見えている罠。
教えてください。 コンパイルオプションで、−DTESTと宣言するとTESTの値は コンパイラーによって不定なのでしょうか? gccでは1が入るようですが。 又、このような状況で #if TEST なんて使うのは邪道ですか? やはり#ifdef TESTとやるべきですか?
>>368 #ifdefを使うべき。
置き換えるものが大事なら-DTEST=3とするだろ。
ああ、もちろん3じゃなくてもいいんだが。
371 :
デフォルトの名無しさん :04/04/14 13:25
以下のプログラムは、p には意味のないアドレスが格納されているため、 必ず初期化しなければいけないとある本に書いてありました。しかし、 以下のようでも、一応コンパイルも出来て、実行もできました。ここで 疑問に思ったことがあります。なぜ、必ず初期化しなくてはいけないのか という事です。僕なりの勝手な推測としては、初期化していないポインタに は意図されていないアドレスが入っていて、そのアドレスがシステムの 何か重要な領域を指している可能性があるとし、その時、そのポインタの指す 領域を書き換えては危険であるから、初期化をいなければいけないとの 推測です。(勝手な推測してすいません。) 本当の所が知りたいです。みなさん、お願いします。 int *p; *p=10; printf("p=%p \n",p); printf("*p=%d \n",*p); 実行結果 p=ffbefbac *p=10
> p には意味のないアドレスが格納されているため
>>371 > p には意味のないアドレスが格納されているため
書き込めないこと、アドレスが他のデータと重なっていること等
がありうるからです。
> は意図されていないアドレスが入っていて、そのアドレスがシステムの
> 何か重要な領域を指している可能性があるとし、その時、そのポインタの指す
> 領域を書き換えては危険であるから、初期化をいなければいけないとの
「通常は」書き換えられないようになっているので、危険ではありません。
そんなことで危険だったら恐ろしくて素人にプログラミングなんかさせられません。
374 :
デフォルトの名無しさん :04/04/14 14:03
>>373 なるほど。意図しないアドレスが指す領域が他のデータと重複してしま
う恐れがあるから初期化しなくてはいけないんですね。
理解できました。ありがとうございます。
データが重複する恐れの有無によらず 確保していない領域に勝手にアクセスしてはいけませんよ。
376 :
371 & 374 :04/04/14 14:30
>>375 以下のように確保していない領域に勝手にアクセス出来たのは、コンパイ
ラの仕様により偶々アクセスできただけなんでしょうかね?
int *p;
*p=10;
例えば、
char u;
int *p;
*p=10;
ようにポインタの宣言に先立って他の変数を宣言すると、実行で
きないですから。
まぁ、ちゃんとポインタを初期化しろって事ですね。
>>376 コンパイラの仕様というよりOSの気まぐれかも
378 :
371 & 374 :04/04/14 14:58
>>377 さっき本を見てたら、そんなような事をみかけました。
まぁ、これ以上、深く立ち入らないで、自分の中では解決としておきます。
みなさんありがとう。
暇なので207がやりたかった事を考察してみる。
・ソースコード上に"Username:"と"Password:"とあった事からログイン処理っぽい
・バッファ上の表示文字列と言う表現があった
そこで導きだされる予想としてネット接続されたホストへ自動ログインするプログラム
を作りたいのではないかと言う事。
ズバリftp自動ログインの為のGUIではないかと思うのだ。
正確にはGUIで指定されたユーザーIDとパスワードを使ってftp接続して、ログインの
成功を判定する処理であろう。
そこで諸君には新入社員の
>>207 が先輩に絞られている間に、そのプログラムを
完成させて頂きたい。
では、健闘を祈る。
>>379 ついでに文字列制御演算子とは何かを考察してみれ
382 :
デフォルトの名無しさん :04/04/14 20:31
UNIX環境でC言語をしております。 mkfifoでパイプファイルを作成するときに ファイルの上限サイズが32kくらいになってしまいます。 このサイズを変更することはできるのでしょうか?
ポインタとアドレスの理解って 変数を別の関数で書き換えたい時はアドレスを渡す。 アドレスを渡されるときはint abc(int *px,int *py)のようにする 位の考えでOK? 初心者でスマソ
多くの人がポインタで悩むし、 ポインタ本なるものもあるわけで。 OKと思う?
385 :
デフォルトの名無しさん :04/04/14 21:49
俺的にはなんでポインタで悩むかがわからん 素直に理解すればいいだけでは? ポインタ変数は変数(入れ物)のある場所(アドレス)を入れる為の変数(入れ物) 他の関数で入れ物(変数)の中身を変えたい時は入れ物(変数)の場所(アドレス)を ポインタ変数(入れ物)に入れて渡してやらなきゃ書き換えられない 複雑に考える必要はないと思う
俺的にはなんで人種差別で悩むのかが分からん 素直に人種差別されないようにすればいいだけでは?
そんなことより
>>382 を教えてくれませんか?
ここよりUNIX板で聞いたほうがいいですか?
俺的にはなんで相対性理論で悩むのかが分からん 素直に理解すればいいだけでは?
俺的には量子コンピューターがなぜ実現できないかが分からん 素直に作ればいいだけでは?
391 :
デフォルトの名無しさん :04/04/14 22:14
>>387 UNIXプログラミングスレッドがあるだろ。
閑古鳥だが答える人はいるぞ。
>>390 十分ややこしいだろ? 現に専門の本さえある。
>>392 ↓これぐらいじゃね?
俺的にはなんで道に迷うのかが分からん
素直に地図見ればいいだけでは?
394 :
デフォルトの名無しさん :04/04/14 22:23
俺的にはコラッツ予想がなぜ証明できないか分からん 素直に証明すればいいだけでは?
>>393 俺には地図も相対性理論も同じぐらいだと思うけどな。
君が地図とポインタが同じくらいだと思うように。
俺的には宇宙の真理がなぜつかめないか分からん 素直に感じればいいだけでは?
ポインタを何かに例えるスレはここですか?
>>382 fifoの上限サイズってなに?32kってどこからでてきた?
399 :
これが決定打! :04/04/14 22:28
俺的には理解できない人間がいることを理解できないのか分からん 素直に理解すればいいだけでは?
俺的には理解できない人間がいることを理解できないのか分からんのが分からん 素直に理解すればいいだけでは?
I am the psychotherapist. Please, describe your problems. Each time you are finished talking, type RET twice.
using System; namespace ex02 { class Class1 { [STAThread] static void Main(string[] args) { int[] a = new int[5];//int型の配列宣言 int i,j;//ループカウンタの宣言 Random rnd = new Random();//乱数を使用するためのクラス for(i = 0;i < 5; i ++)//配列に乱数を代入する a[i] = rnd.Next(100);//乱数は、100までに設定 Console.WriteLine("?"); for(i = 0;i < 5; i ++)//整列前の数値を列挙 { Console.Write(a[i]); Console.Write(" "); } Console.Write("\n\n");//改行
for(i = 0;i < 4; i ++)//基本選択法によるソート { for(j = i;j < 5; j ++) { if(a[i] > a[j]) { int tmp;//変数同士で交換する tmp = a[j]; a[j] = a[i]; a[i] = tmp; } } } Console.WriteLine(?);//整列後の数値を列挙 for(i = 0;i < 5; i ++) { Console.Write(a[i]); Console.Write(" "); } Console.WriteLine("\n?"); Console.ReadLine(); } } } C#の課題として出ました。 ()内に入る文字がわかりません。 解るか倒しえていただけませんでしょうか。 よろしくお願いいたします。
>>401 My problem is that you are my psychotherapist.
もしかして()内に入るのは『5』なのでしょうか?
>>405 そもそも何をやりたいか、どの()のことを聞いているのかがわからん
>>406 失礼いたしました。
(?)となっている3箇所です。
問題は1から100の内ランダムで5個、数字を選び表示。
その後、その5個の数字を小さい順に並び替えるという
プログラムです。
408 :
デフォルトの名無しさん :04/04/14 23:06
> そうなると、さらにやっかいなバグを出す事になる事必死だろう。 実際そうなってるわけです. もし、あなたの使っている携帯電話が、誤動作したら、 「ああ、memcpyつかってかえってばぐってたんだろうな」と思ってください。 かなりの確率であたってます ;-)
409 :
デフォルトの名無しさん :04/04/14 23:07
まずはC#とC言語の区別がつくようになれ。
411 :
デフォルトの名無しさん :04/04/14 23:11
CでPOINTERで悩む理由の一番大きいものは、 「POINTERはむずかしい」と暗示をかけられていることです。 実際、むずかしくもなんともなく配列や構造体より簡単な仕組みなのですが、 「ぽいんたーは、むずかしいぞー、ほーらほら、むずかいいだぞー」って感じで いわれてると、ほんとに難しい気がしてきて、悩むのです。 そういう意味ではvoid氏はPOINTERをさらっとおしえるのがうまいですね。 彼の学生はしっかり理解できてるので、いきなり初見のアセンブラーやらしても平気だし。 Cってのはあるいみ、少し汎用性のある、こじゃれたマクロアセンブラーみたいな ものですから、そこから入るとアセンブラーもすんなりわかるんですよね。 (もちろん、Cがちゃんと理解できていれば、ですが...。逆に言えば、そのあとに アセンブラーがすんなり使えるかどうかで、Cが理解できているかどうかの判別に 使えると思う)。
412 :
デフォルトの名無しさん :04/04/14 23:13
> 小さい順に並び替えるという ×並び換える ○並べ換える
413 :
デフォルトの名無しさん :04/04/14 23:14
> 基本選択法によるソート そもそも「基本」選択法なんていうソーティング方法はありません。 どうみても誤訳です。
>>411 同意。
「ポインタが難しい」なんてのは本を買わせるために悪意ある物書きが広めたデマにすぎない。
>>408 同じ携帯屋かな?
なぜ携帯のソースはあんなに糞なんだろう??
>>407 >(?)となっている3箇所です。
他のところで肝心な処理は済んでるように見えるのだが。これ以上何がしたい
んだ?
418 :
デフォルトの名無しさん :04/04/14 23:45
> なぜ携帯のソースはあんなに糞なんだろう?? わたしの書いた部分だけはきれいです。(でバグがいない)
419 :
デフォルトの名無しさん :04/04/14 23:46
粘着おやじうぜぇ・・・
>>418 そういう奴に限って他人には読めないソースを書いてる罠
関係ない話やめれウスラハゲども。 ↓次の方どぞー
424 :
デフォルトの名無しさん :04/04/15 07:48
標準出力をコンソール出力しつつファイルへ出力する方法はありますか?
425 :
デフォルトの名無しさん :04/04/15 07:57
>>382 サイズがshort型になっているとか?
>>424 標準入力をファイルと標準出力に出力する
プログラムを書けばいいと思うけど
シェルでできるスマートなやり方がありそう。
アポローン ヘッダー! アポローン トラングー! アポローン レッガー! U ・ F ・ O ! がっしーん がっしぃいーん UFO戦士ー ダーイアーポーローン♪
tee
T
>>382 FIFOファイルのサイズなんてなんで気になるんだ?
431 :
デフォルトの名無しさん :04/04/15 08:27
C言語向けのIDEってありますか?
C言語向けの長森瑞佳ってありますか?
433 :
デフォルトの名無しさん :04/04/15 08:41
#include <nagamori.h>
435 :
デフォルトの名無しさん :04/04/15 09:48
swich case で 文字列判定をする方法って どうしもないですか?
もうね、どうしもないよ。
バイト型に変えたりとかしても無理ですか?
では質問を変えてみます BYTE temp; のtempの値が何もない場合の判定方法をお願いします シンボル名 temp 値 0x0000 ''
case 0:
#include <stdio.h> void main() { int n; char ch; printf("数字を入力してください--> "); scanf("%d",&n); printf("文字を入力してください--> "); scanf("%c",&ch); printf("\n\n"); printf("入力された数字は %d です。\n",n); printf("入力された文字は %c です。\n",ch); } これ実行しても数字入力してEnter押した時点で結果まで表示されちゃうんですが。 なんか変なんでしょうか?
数字を入力して文字入力(Enter)しているから、それで正常動作。
つまり、これだと文字入力はできないってことですか?
もしかして435=207か?
>>438 かわいそうだからマジレスしてやる。
>BYTE temp;
ANSI C に「BYTE型」と言う型はない。
>のtempの値が何もない場合の判定方法をお願いします
「値が何もない場合」と言うのは存在しない。
スカラ型変数には必ず何かしらの値が入っている。
後はぼるじょわに聞いてください。
450 :
ぼるじょあ ◆yBEncckFOU :04/04/15 11:04
うゎ、召喚してしまった。
マジレスだと思うが、特に「何もない」の方は。
453 :
デフォルトの名無しさん :04/04/15 11:18
ベクトル型変数って例えば何があるんすか。
454 :
デフォルトの名無しさん :04/04/15 11:19
ポインタですか?
455 :
デフォルトの名無しさん :04/04/15 11:20
456 :
デフォルトの名無しさん :04/04/15 11:21
配列って事ですね。
458 :
デフォルトの名無しさん :04/04/15 12:37
signed intで負の値をunsigned intに、 強制型変換したとき、あるいはその逆をしたとき、 どう扱われるのでしょうか? これらはコンパイラ依存でしょうか?
>>444 >>440 >>442 の言うように、
最初の scanf("%d",&n); で 「数字」を
次の scanf("%c",&ch); で 「数字の後に押した Enterキー」を受け取ってるから、
char enterkey; とかやって
scanf("%d",&n); を scanf("%d%c",&n,&enterkey); みたいにして
Enterキーも処理するようにすればいい。
最初の scanf で数字以外の文字を入力されちゃった場合の処理とかもいれたほうがいいよ。
460 :
デフォルトの名無しさん :04/04/15 17:18
>>440 scanf("%c",&ch); の"%の間に空白を入れる、つまりscanf(" %c",&ch);
のようにすれば良い。
461 :
デフォルトの名無しさん :04/04/15 18:51
C pad for LSI86はてきすとエディタなんですか?
>>458 2 の補数表現を使う環境なら、bit 表現が変わらないだろうという頭で、
規格上どうなってるかなんて気にしてなかったから調べてみた。
|ISO/IEC 9899:1999
|6.3.1.3 Signed and unsigned integers
|1 When a value with integer type is converted to another integer type
| other than _Bool, if the value can be represented by the new type,
| it is unchanged.
|2 Otherwise, if the new type is unsigned, the value is converted by
| repeatedly adding or subtracting one more than the maximum value that
| can be represented in the new type until the value is in the range of
| the new type.
|3 Otherwise, the new type is signed and the value cannot be represented in it;
| either the result is implementation-defined or an implementation-defined
| signal is raised.
この場合、2 が適用されるので結果として、
その負数+(unsigned int で表せる値)+1 になる。
後、「C signed unsigned 変換」でぐぐって見つけた参考ページ↓
ttp://www9.plala.or.jp/sgwr-t/c_sub/TypeConversion.html ttp://okuyama.mt.tama.hosei.ac.jp/unix/C/slide21-1.html
って、signed int → unsigned int だけでその逆を忘れてた。 まぁ、読めばわかると思うけど、unsigned int → signed int の場合、 表現可能な範囲なら 1 で不変、表現不可能な範囲なら、3 になるので 処理系定義だね。
464 :
デフォルトの名無しさん :04/04/16 01:23
>>424 > 標準出力をコンソール出力しつつファイルへ出力する方法はありますか?
man tee
#include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; char ch; if(argc != 2){ printf("パラメーターが違います。\n"); return 1; } fp = fopen(argv[1], "r"); if(fp == NULL){ printf("エラー\n"); return 1; } while((ch=fgetc(fp)) != EOF){ putchar(ch); } fclose(fp); return 0; } 実行するとどうやっても「パラメーター・・・」になります。 実行 − コマンド打って と動かしたいのですがどうすればいいかどなたか教えてください。 よろしくおねがいします
環境は Microsoft visual C++です
467 :
デフォルトの名無しさん :04/04/16 04:43
>>465 どうコマンドを打って実行したのか書けよ。
>>465 argc と argv全部 を printf で出力して確認したほうがいい。
Win のことは分からないけど、
Linux でやってると、コマンドでうったもの以外も argv に入る。
>>468 argv[0]のことを言いたいのかな?
>>465 > 実行 − コマンド打って と動かしたいのですが
最初に実行してから引数与えようとしてない?
471 :
デフォルトの名無しさん :04/04/16 08:31
>>438 初期化しないと不定値。
何も入っていない事を調べることは無理。
>>465-466 プロジェクトの設定の中にコマンドライン引数を指定する項目があるから、
そこで設定するかコマンドプロンプトを開いて直接打ち込めばOK。
473 :
デフォルトの名無しさん :04/04/16 09:02
エクゼ作ってそれをDOSプロンプトから引数つきで叩く もしくはVCでパラメータを設定したあとに実行(!)
>>471 「何も入っていない」のと「不定値が入っている」のとは違う。
みなさんありがとうございました。 解決しました。 実行すれば「ユーザーからの入力を待つ」状態になると考えていたので 「パラメーター・・・」はあたりまえのようです・・ 質問に答えてくださった方本当にありがとうございました 低レベルな間違いですみませんでした・・(汗 よりいっそう勉強がんばります
鮭の骨で歯茎を刺しちまった。。。 いたいよう。。。
477 :
デフォルトの名無しさん :04/04/17 01:39
#define DEBUG(fmt, arg...) fprintf(stderr, fmt, arg) 上記のコードだと、シンタックスエラーになりargを##argにしないとコンパイル できません。なぜ可変長引数マクロの場合##演算子をつけないとコンパイルが通らないのでしょうか? 気になって夜もろくに眠れません。御教示の程、宜しくお願い致します。
>>477 c99は兎も角、古いcには可変長引き数マクロなんてない。
どうせcppは文字列置換しかしないから引き数全体を括弧で括って
一つの引き数と認識させるのが一つの手。
>>479 うを、そんな##の使い方があったのか…
頭いいな
そんな実装をする奴の方が嫌いだ。
>>481 で、何が言いたいんだ?
それが俺らに何の関係があるんだ??
C嫌いで済む奴の戯言は面白くも何ともない
>483 で、何が言いたいんだ? もまえはCが嫌いなんだが主張できない理由でもあるの??
C嫌いな香具師がこのスレに来る必要ないだろ
486 :
デフォルトの名無しさん :04/04/19 11:30
javaって便利yoyoyoyoyoyoyoyoyoyoyoyoyoyo
>>487 「yoyoyo」って、泣いてんだよきっと。
489 :
デフォルトの名無しさん :04/04/19 22:38
CからIEなどのプログラムを動かす方法が載っている ホームページはないでしょうか?
>490 そこまではわかるのですが、 引数の付け方と、フルパスの書き方がわかりません・・・
( ゚д゚)ポカーン
>>489 他にも Windows なら ShellExecute()、CreateProcess() 辺りの API と言う方法もある。
この二つにしろ system() にしろ、使い方はググレ。
494 :
デフォルトの名無しさん :04/04/19 23:42
%s と %c の違いって具体的に何なのですか?
( ゚д゚)ポカーン
%s string %c character と覚えましょう。
教えて君だな。
500 :
デフォルトの名無しさん :04/04/20 13:05
%d と %i の違いって具体的に何なのですか?
>>500 %dは有符号10進数変換。
%iは有符号8,10,16進数変換。
ってか知ってて聞いてないか?
MSDNには、 d int 符号付き 10 進整数。 i int 符号付き 10 進整数。 としか書かれてないが。 しかも一つのフィールド文字で、異なる進数とはどういう意味なんだ?
d, i 符号付き10進 u 符号なし10進 o 符号なし8進 x, X 符号なし16進(小文字、大文字) 基本の底が10進だから%d(ec)でも%i(nt)でもいいようになってるんじゃないかな。
>>502 %i を調べるなら scanf の方を見ないと。
>しかも一つのフィールド文字で、異なる進数
sscanf に "0xA" という文字列を食わせると
%d: 0 ('x' が 10進数じゃないから、その手前までしか読まない)
%i: 10
同様に、"020" を食わせると
%d: 20
%i: 16 ('0' で始まるから 8進数だと判断される)
>%i を調べるなら scanf の方を見ないと。 ああ、なるほど。
scanfに%iがあるから、printfでもあるのか?
500はprintfには限定してないんだから、って事でそ
508 :
デフォルトの名無しさん :04/04/20 15:53
strtolの基数に0を与えた場合のようなものか?
509 :
デフォルトの名無しさん :04/04/20 16:04
じゃば(java)おさーーん。 し(c)げおさーーーん。 こんなアダ名の奴が高校の時いた。
510 :
デフォルトの名無しさん :04/04/20 16:58
VCなのですがポインタ寄りの質問になるのでこちらで聞いてもいいでつか? ポインタの理解に苦しむおっさんです。よろしくです aaa.cファイル内 int Aproc{ BYTE b; 〜内部コード略〜 } の変数Bを bbb.cファイル内の関数 BOOL BProc{ } の内部処理で値変更をしたいのですが。この場合ポインタ渡しになりますか? 両関数は引数をもっていないのですが
引数なしって、bのポインタはどうやってBproc()に渡す気なのよ。
int Aproc() { BYTE b; BProc(&b); } bool BProc(BYTE *pt) { *pt=1; } 引数が使えないならグローバル変数にしてextern汁。 渡したい変数が多いなら、構造体にして渡す。
513 :
デフォルトの名無しさん :04/04/20 17:19
> BOOL BProc{ これはエラーなんだから、実際に書くときは引数ありなんじゃねーの?
>>510 >ポインタの理解に苦しむおっさんです。
ポインタ以前の問題だな
>>510 別に値を渡して変更結果を戻り値で貰ってもいいんだが
>BOOL BProc{
>
>}
BProc() の戻り値は (BOOL 型の) 別の何かに使ってるみたいだから
1. ポインタで渡す
2. グローバル変数
のどっちか。但し 2 は激しくお薦めしない。
みなさんありがとう Cって難しいですね。ご指摘の通り グローバル変数は使用を見合わせて 引数で対応してみる事にします。 この場合引数に何も値がない場合の処理を判定しないといけないんですが そこんところもできれば お願いします。
なるほど何か明示的に値をいれてあげないといけないのですね。 今回呼び出される関数Aはタイマーイベントにより一定の間隔で 常時動いている処理なのです。 で関数Bの処理がある条件を満たした時、臨時的に関数Aを呼びだす仕様なもので もし 引数式の関数Aに変更する場合は 引数がNULLの場合は通常の値を取得 Not NULLの場合はパラメタ引数として引き継いだ値をもって処理するように したいのです。Cは私の担当外なもので本ちらちら見たくらいしかスキルありません どうか無様をお許しください
519 :
デフォルトの名無しさん :04/04/20 20:15
基本的なことについてお伺いしたいのですが。 typedef struct Word_tag{ char *name; int count; struct Word_tag *next; } Word; という連結リストの構造体Wordがあったとき、ある要素へのポインタposが分かっているとき、その 要素の次に要素new_itemを挿入するには、 new_item->next = pos->next; pos->next = new_item; とする、とある本には書いてあるのですが、どうしてそのようになるのですか?上の二式は暗記するものなのでしょうか? 削除をしたい場合についても同様です。教えてください。
暗記もなにも、連結リストのイメージ思い浮かべたら分からないか?
箱と矢印を描いて考える
itemA --> pos --> itemB を itemA --> pos --> new_item --> itemB にするわけだから、 new_item->nextに、itemB(つまり元のpos->next)を代入し、 > new_item->next = pos->next; pos->nextにnew_itemを代入する。 > pos->next = new_item;
返信ありがとうございます。 まだ分かったような分かっていないような感じなので一晩考えてきます。
DOS窓でprintfの文字への座標指定の仕方、 色の変え方、分かる人がいたら教えてください。
>>524 まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
527 :
デフォルトの名無しさん :04/04/20 22:12
>>510 210ペイジや306ペイジに図入りでわかりやすく解説してありますよ。
>526 日本語が読めないのですか?理解できないんですか?
529 :
デフォルトの名無しさん :04/04/20 22:21
Cを使っているのだからCの問題なのです!!!
530 :
デフォルトの名無しさん :04/04/20 22:22
>>527 「ペイジ」という書き方で、どの本のことか分かるな。(笑)
それは間抜けな話しですね :-)
旅に出ます(´Д⊂ヽ
533 :
デフォルトの名無しさん :04/04/20 22:31
>>524 nnansi.sysを入れろ
curses.dllを入れろ
終了
>>524 この質問、なんで一定周期で出てくるの?
もう聞き飽きたよ。
537 :
デフォルトの名無しさん :04/04/20 23:17
ちっとも「一定周期」じゃねーじゃん。
聞き飽きるほど長く質問スレに居座るなよ(w
540 :
デフォルトの名無しさん :04/04/21 15:25
すみません、質問させて下さい。 配列の宣言って、こんな風にするのは駄目なのでしょうか。 ↓charの所が、エラー「定数式が必要」となるんです(´・ω・`) int x; printf("君は何文字入力したいんだ。整数を入れてくれ\n"); scanf("%d",x); char hairetu[x++]; /*++は、null文字用*/ printf("そうか、%d文字入力したいんだな。うん。\n",x);
C99なら可だが、上のには問題がいくつかある。
うーーん、そうなんですか。ありがとうございます。
Cの勉強し始めてまだ1ヶ月たってないものでして、、なにか他の方法など考えてみますね(´・ω・`)
>>542 scanfとかはあまり使わない方がいいとか聞くんですけれど、そういうことではなく
もっと根本的な問題とか、あるのでしょうか…?
私自身でも出来るだけ良いプログラムを書こうと、努力?してますが、
ご指摘頂ければさいわいです(´・ω・`)ゞ
#include <stdio.h> #include <math.h> int main(void) { int i; double x, y; puts("正の整数を入力してください。"); printf("整数:"); scanf("%d", &x); y=log10(x); i=y; printf("%dの桁数は%dです。\n",x,i); return (0); } 桁数を求めるブログラム うまくいかないよ、、、
>>543 1. scanf() の2番目以降の引き数はポインタ。
2. x++ は x をインクリメントするが、返す値はインクリメント前。
>>544 scanf() の書式は "%d" なのに、double へのポインタを渡している。
546 :
デフォルトの名無しさん :04/04/21 16:31
秋の基本情報に向けて明解C言語の入門編と Cプログラマのためのデータ構造とアルゴリズムを買って来ました。
printf("整数:"); scanf("%f", &x);
y=log10(x);
i=y;
printf("%fの桁数は%dです。\n",x,i);
return (0);
}
>>544 こうしてみましたが、まだどこかおかしいみたいです。
自分では煮詰まってしまって見えないのです、、
scanf("%lf", &x);
550 :
デフォルトの名無しさん :04/04/21 17:08
#define PrintHello(str) printf("Hello str!"); int main(int argc, char* argv[]) { PrintHello(World) } 実行結果 Hello str! ↑ マクロ部分を書き換えて Hello World! と表示されるようにできませんか?
>>550 define PrintHello(str) printf("Hello " #str "!\n");
>>551 やっとマクロの使い方がわかりかけてきますた。
どーもありがとん。
2日程考えたのですが、どーしても出来ないので、 御教授を受けに来ました。 char c; int month2,day2 ; printf ("入力してください\n"); scanf("%c",&c); printf ("\n"); printf("cの中身=%c\n",c); sscanf(c,"%d/%d",&month2,&day2); /* 引数cから、月と日を取り出す。*/ printf("%d月 %d日",&month2,&day2); 上記のはプログラムの一部を抜粋した物なのですが、 (なので#include〜等は省略しています) scanf文で「3/21」や「12/25」と言った文字を入力して、 sscanf文でmonth2,day2に格納、 printf文で出力。 と言う手順にしたいのですが、 どうしてもmonth2.day2に上手く格納がされません。 宜しければ御教授の程お願い致します_| ̄|○
scanf("%d/%d", &manth2, &day2);
ちょっと待て。 char cに "3/21"などという文字列が代入できるわけがない。
以下のプログラムを、scanf文実行前に関数strncpyを用いてrecord構造体の初期化をするプログラムにしろと言うのですが 自分なりにやってみても実行するとエラーが出てきて・・。助言お願いします(´ω`) int main(void){ struct goods{ char name[20]; char type[10]; char price[5]; }record; FILE *fp; int size; size=sizeof(record); fp =fopen("file1f","w"); if(fp==NULL){ printf("open error"); exit(1); } while(printf("name?type?price?") ,scanf("%s%s%s",record.name,record.type,record.price)!=EOF){ fwrite(&record,size,1,fp); } fclose(fp); return(0); }
>>554 Σ(´Д`)ナルホドッ
そんな単純な文で良かったのか……不覚。
えと、では重ねて御質問なのですが、
sscanf文を使って格納する場合には、
どの様にしたら宜しいのでしょうか?
>>555 と、言う事は何と定義すれば宜しかったのでしょうか?
一応string文として試したりはしたのですが……_| ̄|○
>>545 2は、わかりました(`・ω・´)以後気を付けます
1は、ポインタですか〜、*とか&とか、まだ手を付けてさえいない…_| ̄|○もっと、勉強シマス…。
アリガトウ御座いますッ。
プログラムの頭に string.hをつけるとセグメントエラーと出てプログラムが実行できません... 確か、実行コマンドを変えると出来たと思ったのですが、 検索しても思い出す事ができず。 どなたか教えてください。
おかしいな、日本語のはずだが・・・。
バグがある、間違いなく
>>557 >sscanf文を使って格納する場合には、
>どの様にしたら宜しいのでしょうか?
Cにstring型はありません。文字列にはcharの配列を使います。
こんな感じ。
char c[128];
scanf("%s", c);
sscanf(c, "%d/%d", &month2, &day2);
>>560 確かに。日本語なのに何を言いたいのかさっぱりわからんな・・。
564 :
デフォルトの名無しさん :04/04/21 20:52
永久ループの方法おしえてください while(??){ }
>>564 char s[]="釣り";
while(*s){
;
}
566 :
デフォルトの名無しさん :04/04/21 20:57
>>565 おもしろいんですが
もう少しシンプルなやつ気ボンヌ
567 :
デフォルトの名無しさん :04/04/21 20:59
>564 for(;;) { } が良いかも。 while(1) { } だと ワーニングになるから。 (私は最大限のワーニングを出すようにしているので)
Linux上のapacheのモジュールって、mod_*.oの形式のようですが、どのような仕組みで 実行時にリンクしているのでしょうか? dllじゃないから、dlopen()ではなかろうと思うのですが。どなたか解説お願いします。
569 :
デフォルトの名無しさん :04/04/21 21:07
永久ループいけますた ありがとうございます。
じつーはービフィズスきーんはーおなかーのなかにーいるんです!
571 :
デフォルトの名無しさん :04/04/21 21:31
while("無限ループ"){;} わかりやすい。
ソースプログラムをメモ帳で書いて保存して、 コマンドプロンプトってところにファイル名入れればコンパイルしてくれるんでそゆか?
>> 568 #insmod mod_*.o で、モジュール組み込み kernel内にモジュールとして組み込まれて、 systemcall呼ばれると起こされる(動作する)。 apacheのモジュール使いたいならapacheのソース読め。 そして改造しなさい。それと、Linux版行けよ。
なぜApacheでLinux板?ん、版?Linux版Apache?
linux上云々は余計だったね。 つーか、574はアホアホレス。僕が言ってるのはapacheの組み込みモジュールのことだよ。 カーネルのモジュールの話じゃないよ。 apacheが起動時に必要なモジュールを組み込むけど、mmap()でもした領域にオブジェクト 形式のモジュールを読み込んで、このモジュールをapache自身が何ステップも掛けて初期化 してるのか、なんて想像してみたんだけど、こんな手順で良いのかわからないので聞いたの。
またそんな煽り口調で返すと…
つーか、574はアホアホレス。
580 :
デフォルトの名無しさん :04/04/22 02:49
> だと ワーニングになるから。 やーい > わーにんぐ
ワーニングってアホっぽい響きだな
ヲーニングもなんかやだw
うぉ
ウホッニング
ウホッ いい警告 デ バ ッ グ や ら な い か
それは3495ペイジに載ってますね。
>>562 亀レスですが、昨日は急な用事で御返事出来ず申し訳有りませんでした。
重ね重ねアドバイス有難う御座います(`・ω・´)
VC++5.0でコンパイルしました。 FILE *fp; char buff[1024]; fp = fopen("hoge.txt", "r"); if (fp == NULL) return; while (fgets(buff, sizeof(buff), fp) != NULL) { printf("%s", buff); } fclose(fp); というプログラムでfopen時にはfpはNULLではないのに fgets()の途中でNULLになってしまうことはありますか? 下記のエラーが出ました。 Debug Assertion Failed! Program c:\hoge.exe File: fgets.c Line: 60 Expression: str != NULL For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. (Press Retry to debug the application) よろしくお願いします。
>>588 fgetsの関数リファレンスくらい読んだら?
fgetsの返値を調べれば一発で解るでしょ。
ちなみに、上記の例では、ほぼ必ずNULLが返る。
>>589 再現ができないので戻り値を調べることができないんです。
ポインタの使い方を説明するときによくあるswap関数について。 swap(int *a, int *b) { temp = *a; *a = *b; *b = temp; } どうしてこれで入れ替えることができて、 swap(int a, int b) { temp = a; a = b; b = temp; } これではできないのですか?本にその説明はあるのですが、やっぱりよく分かりません。 上の二つの関数の違いについて詳しく説明していただきたいのですが。
>>591 値渡しだから。つまり、引数に渡したもののコピーが渡るだけなので
いくらコピーをいじっても元に影響を与えることができない。
ポインタなら、アドレスのコピーでも差す先は同じだから変更できる。
>>588 では直っているが、実は元は
if (fp = NULL) return;
になっていた、に 20 ウォン。
>>589 後学の為に、関数の呼び出しもとの変数を合法的に書き換える方法を
教えて下さい。
>>595 そんなことなってません。
というか自分でテストする限り再現できないんです。
ユーザーからこんなエラーが出たっていわれてfgetsは
そこの一箇所で、しかもユーザーからも今回初めてで
その後は正常に動いているんです。
どっちかというと
>>589 の言ってることが分からん。
NULLが返ったにしてもエラーにはならんだろ。
>>596 ありゃ、失敬。
しかしそうなると厄介だなぁ。
>File: fgets.c
>Line: 60
>
>Expression: str != NULL
(デバッグ版かよ!ってのはさておき)
誰かが fp を 0 にしてるのは確かなんだけど…
fp と buff はローカル変数なんだよね?
>>598 デバッグ版ですみません。
リリース版の挙動が違ったら困るのでデバッグ版をリリースしてます。
fpとbuffはローカルです。
たまたまだよってことで許してくれるかなー
600
何気にキリ番ゲットとわっ!
となると、メモリ破壊ぐらいしかない気がするが… マルチスレッドで並行して走ってるコードはある?
>while (fgets(buff, sizeof(buff), fp) != NULL) { これが"fgets.c"の60行目なの?
>>602 いえ、ありません。ちなみにwhileの中の本当のコードは
while (fgets(buff, sizeof(buff), fp) != NULL) {
cnt++;
}
なんです。
>>603 fgets.cはたぶんCのライブラリのことだと思います。
>>588 >ユーザーからこんなエラーが出たっていわれてfgetsは
>そこの一箇所で、しかもユーザーからも今回初めてで
>その後は正常に動いているんです。
エラーがでたときのユーザーの環境で、hoge.txtファイルのなかみ
が空だったんじゃないの?
fgets.c:
60 : _ASSERTE(str != NULL);
fgets() の 3番目の引き数が NULL かどうかのチェック。
>>606 だからぁ…それで fp が書き換わるのか?と。
>>608 fpの値は、変化ないよ。
べつにfpの値が壊れなくても、
ファイルが空ならfgetsの返値はNULLになるでしょう。
while (1){ if (fp != NULL) { if (fgets(buff, sizeof(buff), fp) == NULL) break; } else { break; } cnt++; } これでいいかなぁ
多次元配列を関数の引数に渡すことは出来ないのでしょうか? void main(){ int kazu[][]; ~ 多次元配列kazuに対して数字を入れる処理。 ~ } int kansu(int kazu[][]){ 和を計算する処理。 return(sum); } こんな感じに作ってみたのですが、kazu[][]が0とかいうエラーが出てしまいます。
kazu[][]って書いたの? だったらエラー決定。 ご愁傷様。
614 :
デフォルトの名無しさん :04/04/22 18:59
Expression: str != NULLのstrがどこにもないと思うのは俺だけ?
ああ、fgetsの中の話なのか。
>>613 ほとんど全部といっても過言ではないです。
その前後とはまったく関係ない処理なんで。
>>614 私もそう思います。
>>611 配列やら配列の先頭のポインタ、配列のサイズを渡して
やろうって発想はできませんか。
ファイルの中身がfgetsで扱えるデータじゃないっぽいな。
>>619 えぇ!!
そんなデータがあるんですか?
#define N 32 int main(){ int kazu[N][N]; ~ 多次元配列kazuに対して数字を入れる処理。 ~ } int kansu(int kazu[][N]){ 和を計算する処理。 return sum; }
622 :
デフォルトの名無しさん :04/04/22 22:06
#include <iostream.h> int main() { cout << "#include <iostream.h>" << endl << endl; cout << "int main()" << endl; cout << "{" << endl; cout << "cout << ゛Hello World ゛<< endl; " << endl; cout << "}"; }
623 :
デフォルトの名無しさん :04/04/22 22:49
624 :
デフォルトの名無しさん :04/04/22 22:52
> fp = fopen("hoge.txt", "r"); > if (fp == NULL) return; わけて書くなよ ぼけ
625 :
デフォルトの名無しさん :04/04/22 22:53
s/扱える/扱うべき/
厨
627 :
デフォルトの名無しさん :04/04/22 22:56
> だと ワーニングになるから。 > (私は最大限のワーニングを出すようにしているので) やーい > ワーニング Star Warsは「スター・わーず」か?
628 :
デフォルトの名無しさん :04/04/22 23:04
> その前後とはまったく関係ない処理なんで。 というか、そういうところにたいがいのバグの90%以上があるんだよ。 そもそも、原因を切り分けするために、現象が起きる最小のコードにまで切り詰める のが常識だろ。だんだんスリムアップしていって、あるところで出なくなったら その直前に削除した部分があやしいわけ。 で、十分にスリムアップして(機密部分などがなくなって、pasteするのに十分な小ささに)、 「これで起きるんですが」と「そのままコード全部」をpasteするのが常識。 (まあ、そこまでやるうちに、99%の場合は解決しちゃうんだけどな)
ん、現象が再現しなくて困ってるんでないの?
>>628 再現性があればそれもできますが、客先でしか再現(しかもたまに)しないので。
>>629 >というか、そういうところにたいがいのバグの90%以上があるんだよ。
でも、これはその通りかもしれません。
そういえば、他のプログラムが同じファイルに対してアクセスしている
可能性が無きにしもあらずです。
その辺、調べてみます。
あ、ポインタ間違えた
>>588 while()ループでfpがNULLになってからもう一回fgets()が呼び出されちゃうこ
とがあるんじゃない?feof()でチェックするようにしたらどうかな?
そもそもfgetsが返すNULLはEOFかエラーか区別できないはず。
634 :
デフォルトの名無しさん :04/04/22 23:43
>>630 だからこそ、再現するやつとしないやつで、
どんどん切り分けるんだってば。そんなの常識。
あるバグなんて、デバッグ用のprintf()を1つ入れるか入れないかで再現したりしなかったり
するんだけど、そういう不安定なバグをおいつめるこそ醍醐味。
635 :
デフォルトの名無しさん :04/04/22 23:45
>>631 いや、その前にあやしいところがいっぱいありそう。
-W4にしてコンパイルするとウォーニングがいっぱいでるようなソースじゃないのか?
まあ
3000行以内のソースなら、
15分もあれば、「ここが原因じゃん」と指摘してあげられるんだがな。
その気になったらソースをメイルしろ。
>>633 なにやら興味深いレスです。今日はもうすっかり眠くなってきたので
明日がんばります。
>>634 自分でやれるならいくらでもやるんですが
お客さんにやってもらわないといけないので、トライ&エラーというわけにも
いかなくて。
でもそれしかないんですかねー。やっぱり。
637 :
デフォルトの名無しさん :04/04/22 23:48
>>633 っていうか、EOF以外のエラーが返ってきたからといってどうするんだよ
もういっかい読んでみるのか?
638 :
デフォルトの名無しさん :04/04/22 23:49
>>636 っていうか客にそんなことさせるなよ。ぼけ
とにかくソースを全部見直せ
そもそも、ほんとにfgetsで落ちてるのかどうか怪しいなァ ステップ単位にログ吐くかなぁ
641 :
デフォルトの名無しさん :04/04/22 23:59
コンパイラ(Borlandの無料のやつです)のPATHの設定がよくないみたいで、 C:\Documents and Settings\Owner>になってしまったよ あとbcc32.cfgとilink32.cfgを保存する場所がわからないんです
642 :
デフォルトの名無しさん :04/04/23 00:01
C:\Borland\bcc55\Binは一体どこにあるの??
641=642です
マジレスすると、 C:\Borland\bcc55\Bin は C:\Borland\bcc55\Bin にあるよ。
>>608 >60 : _ASSERTE(str != NULL);
>fgets() の 3番目の引き数が NULL かどうかのチェック。
第一引数じゃないのか?と小一時間(ry
>>588 単純に呼び元で fp 破壊してないか?
fpを宣言しているあたりを正確に晒せ
前後で配列とか用意してない?
647 :
デフォルトの名無しさん :04/04/23 00:09
叩かれるの覚悟でやってきました。 #include<stdio.h> main() { int a; a = 0; printf("%d","%d",a); } これやったら 106 って出るんだけど何で?
> printf("%d","%d",a); 正しいかこれ?
>>643 カレントディレクトリとPATHを混同してませんか
106とはまた小さなアドレスだなあ
>>648 文法的には正しいが、printfの使い方としては間違ってる。
106ってmainの返り値と違うか?
>>652 sizeof(int)==2、sizeof(char*)==4
の環境で桁落ちしたのかもよ?
657 :
デフォルトの名無しさん :04/04/23 01:16
大学入学したての超初心者で申し訳ないですが、 文字列123-4567-890を数値部のみ整数の形で出力する プログラム作るにはどうすればいいかな? 文字列を整数にするのにatoi関数を使うって聞いたけど、 それって"-"が入ってるから123で配列に入れ直してからじゃないといけないのかな?
int main(int argc, char **argv) { printf("1234567890"); } 答えだ。 ありがたく思え。
>>658 main()の引数は何に使うんですか?
sscanf("123-4567-790","%3u-%4u-%3u",&a,&b,&c); とか?
strtol()でも使っとけ。どこまで処理したかわかるので、ハイフン読みとばせばOK。
#define PROGRAM \ "my $input = \"123-4567-890\";" \ "$input =~ s/-//g;" \ "print $input;" system("perl -e '" PROGRAM "'");
char *src="123-4567-890"; char dst[16]; char *sp, *dp; for(sp=src, dp=dst; *sp != '\0'; *sp++) if(*sp >= '0' && *sp <= '9') *dp++ = *sp; printf("%s\n", dst);
>>661 sscanf()でもどこまで処理したかわかるよ。
すみません。教えてください。 #include <stdio.h> #include <string.h> void main(int argc,char *argv[]){ int X,Y; sscanf(argv[1],"%d,%d",&X,&Y); } 上のばあいコンパイルしてくれないです。 argv[1]のかわりに文字配列なら当然問題ないです。 #include <stdio.h> #include <string.h> void main(int argc,char *argv[]){ int X,Y; char temp[]="123,123"; sscanf(temp,"%d,%d",&X,&Y); }
>上のばあいコンパイルしてくれないです。 コンパイル時に出力されたエラーメッセージなどをよくご確認の上、 このスレが適当かどうか検討してみてください。
>>657 引き数として与えられた文字列の数字のみを抜き出すプログラム。多分これで完璧?
#include <stdlib.h>
int main(int argc, char **argv){
char *cReadSpell, *cWriteSpell;
int nSpellLen, counter, nAsciiCode, nWriteNumber;
if(argc != 2){
printf("引き数不正\n");
return -1;
}
nSpellLen = strlen(*(argv+1)) + 1;
cReadSpell = (char*)malloc(nSpellLen);
strcpy(cReadSpell, (const char*)(*(argv+1)));
cWriteSpell = (char*)malloc(nSpellLen);
strcpy(cWriteSpell, "\0");
for(counter = 0; cReadSpell[counter] != '\0'; counter++){
nAsciiCode = *(cReadSpell+counter);
nSpellLen = strlen(cWriteSpell);
if(nAsciiCode >= 48 && nAsciiCode<= 57){
cWriteSpell[nSpellLen] = *(cReadSpell+counter);
}
}
strcat(cWriteSpell, "\0");
nSpellLen = atoi(cWriteSpell);
printf("%d\n", nSpellLen);
free(cReadSpell);
free(cWriteSpell);
return 0;
}
typedef struct{ int a; int b; }T; const T t={ a:1; b:2; }; こんな記述をどこかでみた気がするんですが これは標準じゃないですよね
669 :
デフォルトの名無しさん :04/04/23 03:44
C言語の基礎的な文法を習得したあとってどんな事やればいいの?? どんんあプログラム作ればいいの?? 教えて教えて きゃーー >▽<
670 :
デフォルトの名無しさん :04/04/23 03:50
まったくわからないです。 教えてください。 ( 問 題 ) 2つのファイルを連結するプログラムを作成。 以上宜しくお願いします。
>>667 >strcpy(cWriteSpell, "\0");
二重に非効率。
>if(nAsciiCode >= 48 && nAsciiCode<= 57){
環境依存。不適当な変数名の使用。
>nSpellLen = atoi(cWriteSpell);
不適当な変数名の使用。
>return -1;
環境依存。
>strcat(cWriteSpell, "\0");
全く無意味。無駄。
>(*(argv+1))
可読性を損なっている。
>*(cReadSpell+counter)
表記の不統一。
総合評価:
ダーメダメじゃ〜ん。
>>670 #include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char * buf;
if (argc < 3) {
return EXIT_FAILURE;
}
buf = malloc(strlen(argv[1]) + strlen(argv[2]));
sprintf(buf, "/bin/cat %s %s", argv[1], argv[2]);
system(buf);
free(buf);
return EXIT_SUCCESS;
}
>>671 わざとひどいコードを書いてるんでしょう。
>>657 #include <stdio.h>
#include <ctype.h>
int main(int argc, char **argv)
{
int i = 0;
for (; argv[1][i]; i++) isdigit(argv[1][i]) && putchar(argv[1][i]);
return 0;
}
...低水準入出力関数おぼえたて #include <いろいろ> unsigned char buffer[ 1024 ]; int fdi, fdo; void writesub ( char * ); int main( int argc, char *argv[] ){ if ( argc != 4 ){ fprintf( stderr, "usage %s input1 input2 output\n", argv[ 0 ] ); exit( EXIT_FAILURE ); } if ( ( fdo = open( argv[ 3 ], O_WRONLY|O_TRUNC ) ) < 0 ) fdo = creat( argv[ 3 ], S_IREAD|S_IWRITE ); writesub( argv[ 1 ] ); lseek( fdo, 0, SEEK_END ); writesub( argv[ 2 ] ); close( fdo ); return EXIT_SUCCESS; } void writesub( char *arg ){ int flg; fdi = open( arg, O_RDONLY ); while ( 1 ){ if ( ( flg = read( fdi, buffer, 1024 ) ) > 0 ) write( fdo, buffer, flg ); else if ( flg == 0 ) break; else puts( "NEVERMIND" ); } close( fdi ); }
>>674 読みにくっ!!
Usenixあたりにキタナイコードコンテストってあったよな。
>>675 ...なんかくれるなら
応募するかもです。最悪コンテスト。
$ cat ファイルA ファイルB > ファイルC
678 :
デフォルトの名無しさん :04/04/23 07:36
>>647 > #include<stdio.h>
空白空けろよ ぼけ
679 :
デフォルトの名無しさん :04/04/23 07:38
> 引き数として与えられた 引き数 -> 引数 (で、読み方は「ひきすう」)
680 :
デフォルトの名無しさん :04/04/23 07:39
>>674 カッコのうちがわあけるなよぼけ
こういう書き方するやつに、ぼけなコード書くやつが多いな。経験的に。
添削おつ。まぁ完璧と書いたのは調子に乗っていた。夜中だったし。 とりあえず動くものを、と思っていたので変数を使いまわしたりした。 名前も即興だ。ただ、なるほどと思える指摘もあったので参考にします。 コメントかければまだましだったのでしょうが改行多すぎで投稿できなか った。
アク禁クラッテタ━━━━(・Д・)━━━━!
>>645 str は string じゃなくて stream。FGETS.C での fgets() の定義↓
char * __cdecl fgets (_TSCHAR *string, int count, FILE *str)
684 :
デフォルトの名無しさん :04/04/23 09:56
>>645 strがstringの略だと思ったんだろうが、この場合のstrはstreamの略。
VCをもっているならfgets.cを読んでみな。
まさかかぶるとは・・・
686 :
デフォルトの名無しさん :04/04/23 10:00
>>588 昨日はすっかり忘れてたけど、他の関数からfgetsを内部的に
呼び出してる可能性は?
少なくともC-Runtimeにはなさそうだけど。
>>683-684 俺もかぶりそうだったよw
ISDNはじめちゃん?
691 :
デフォルトの名無しさん :04/04/23 10:21
>>671 return -1
が環境依存ってどういうこと?
ということはやはりfgetsでfpがNULLになってるという 例外エラーとみて間違いないですね。 うーん。なんでやろ
693 :
デフォルトの名無しさん :04/04/23 10:34
>>691 main関数に限ってということだろう。
解決
>>695 マルチスレッドで動いてるわけではないんですけど
他のソフトから同時に同じファイルを対象に起動されていたり
他のソフトも同じファイルにアクセスしていたりしたので
そのあたりかなと。検証はこれからですが。
>>696 それでオープン中のファイルのファイルポインタがNULLにはならないだろう。
>>699 >fgetsはそこの一箇所
じゃなかったのか?
>>700 やはり問題はfgetsなんでしょうか?
fgetsは一箇所です。
>>588 のとおりです。
>>701 本当にそのままか?
バッファを動的に確保してサイズ計算してたりしてないか?
その「他のソフト」がファイルを消すか上書きしてるとか。
>>702 してないです。違うのはprintfがcnt++になっただけです。
行数数えてるだけなので。
だってファイルロックしてないじゃん
てことはflockなりを足せば解決かな?
fgetsのソース持ってきて、念のために名前変えてからそれを呼ぶようにして、 中をトレースすべし。
>>708 自分だけflockしても意味ないですよね?
>>709 そうかもしれないです。それでfpはNULLになるんですかねー。
>>710 fgetsのソースが見当たらないです。
別の、安全なファイルを用意してやってみれば? あるいはstdinとか。
>>703 >>588 のソースのwhile文中にSleep()を入れて、
同じファイルに上書き、ファイル削除を試みたら、
上書きは出来たが削除は出来なかった。
エラーも起きなかった。
>>711 fp がNULLになるのは藻前のソースの問題かと。
メモリ破壊が起きているに100ヌルポ
どうやったらメモリ破壊できますかねー
他のリソースが開いてる間にファイルを今より丸めることってできないの?
/tmpにファイルコピーしてから処理したらどう?
>>719 実はその方向で行くことになりそうです。
721 :
デフォルトの名無しさん :04/04/23 14:03
windowsでもちゅるんできますか?
またちゅるんか!
>>688 これ作ったのアニヲタじゃんw 審査員も普通にわかったりするんかな。
これでakuがsokuコンパイル&実行→sokuがzanコンパイル&実行…で無限ループに
なったらおもしろいな。
725 :
デフォルトの名無しさん :04/04/23 14:25
作ったのは多分日本人だね。
悪・即・斬!
D・V・D!
if ((p = malloc(..)) == NULL) return; if ((fp = fopen(..)) == NULL){ free(p); return; } if (fwrite(..)) == -1){ fclose(fp); free(p); return; } エラー処理が延々と長くなっていくんだけど、なんかカコイイ!記述方法って ない? オブジェクト指向方面でなんか解法があったと思ったけど、わからん…
if ((p = malloc(..)) == NULL) goto END; if ((fp = fopen(..)) == NULL) goto END; if (fwrite(..)) == -1) goto END; END: fclose(fp); free(p); return; で、どう?カコイイくは無いと思うが。 C++でならtry...catchがあるけど、ここCスレだし。
>>729 を簡略化して
#define try(val, fn) {if ((val = fn) == NULL) goto END;}
と定義してから
try(p, malloc(...))
try(fp, fopen(...))
END:
(後処理)
とか。fwriteをどうするかは聞かんでくれ。
>>728 if ((p = malloc(..)) == NULL) goto MALLOC_ERROR;
if ((fp = fopen(..)) == NULL) goto FOPEN_ERROR;
if (fwrite(..)) == -1) goto FWRITE_ERROR;
goto NULLPO;
FWRITE_ERROR:
fclose(fp);
FOPEN_ERROR:
free(p);
MALLOC_ERROR:
return;
NULLPO:
>>728 おいおい、fwrite()の戻り値を-1と比較しちゃダメじゃん。
733 :
デフォルトの名無しさん :04/04/23 23:02
UNIXのwriteの勘違いしているんだろうな。 fwriteの戻り値の型はsize_t(符号無し整数)だ。
それくらい統一しろよ・・・。
735 :
デフォルトの名無しさん :04/04/23 23:34
PASCALって何につかうんすか? あとFARも教えて
736 :
デフォルトの名無しさん :04/04/23 23:36
737 :
デフォルトの名無しさん :04/04/23 23:56
今日始めてCを触ったんですが。 int main() { double kai; double pai = 3.14; kai = 10 * pai; printf("%f\n"); return 0; } これで、31.400000というのがprintされたんですけど、 この0の数ってのはどこから来てるのかよくわかりません。 31.4と表示するにはどうすればいいのでしょうか。
738 :
デフォルトの名無しさん :04/04/24 00:15
パソコンは数字を二進数で扱っているので少数は どうしても誤差が生じる。 int main() { double kai; double pai = 3.14; kai = 10 * pai; printf("%.1f\n",kai); //%の後に.(ドット)ね return 0; }
739 :
デフォルトの名無しさん :04/04/24 00:16
>>737 ネタで言ってるだろ
小数点が必要だからって何故にdoubleなんてつかうんだ
最近まで、%E が意味不明だった者ですが、 たぶん %.1f だと思います。
ネタではないです intやshortを使ったのですが、0.000000となるのでだめぽと思ったんです %.1fにすると確かに出来ました。 これは小数点以下1桁を表してるんですかね ありがとうございました
>>737 >printf("%f\n");
>これで、31.400000というのがprintされたんですけど、
嘘をつくな。
このコードでは何が表示されるか解らんはずだ。
C言語以前の問題なんですがお願いします。 LSI-C 試食版 と C Pad 開発環境 を ダウンロードしろと言われたのですが LSI-C 試食版を落としてからどうすればいいのか 分かりません。どうかお願いします。
744 :
デフォルトの名無しさん :04/04/24 00:38
管制塔がどうこうという話で 初期化で疑問に思う事がでてきました。 memset(strtmp,NULL,MAX_PATH); memset(strtmp,'\0',MAX_PATH); NULLはゼロと解釈してますが この場合どう違うのでしょう
>>744 値としては0だが、ポインタとしての0番地を表すのに使うためにある名前なので、
NULLをそこにいれるのは単に間違い。
コンパイルは通ってしまうが。
>>744 >memset(strtmp,NULL,MAX_PATH);
NULLは多くの環境で(void*)でキャストした0が使われる。
memset()の第二引数の型はintなので本来の意味的には
>memset(strtmp,'\0',MAX_PATH);
が正しい。
# 文字定数の型はint
>>744 NULLはNullポインタであって、ゼロではないです。
748 :
デフォルトの名無しさん :04/04/24 00:47
>>745 >>746 分かり良い説明ありがとうございます。
まさにコンパイル通っているので うちのシステムにも問題があると
わかりました。流用ソースの殆どがNULLでコード書いてあるのです。
>今日始めてCを触ったんですが。 ここがネタっぽいんだよなぁ。
>>748 まあ、
#define NULL 0
なんて定義があるはずなので実際には変わらないけどね
#define ((void *)0) かもしれない。
今日始めてCを触ったんですが 符号付整数型の負の最大値を-1で割って正しい結果をだしたいのですが どうしたらいいですか
>>753 >今日始めてCを触ったんですが
嘘だろ?
ごめんなさい
はじめてのCで早くいっちゃいました。
そういや昔「はじめてのC」って本があったな。
電車の中で読むとなぜか周りが引きます。
>>728 fp=NULL;
p=malloc(..);
if(p) fp = fopen(..);
if(fp){
fwrite(..);
fclose(fp);
}
if(p) free(p);
return;
とりあえず 1の補数表現を用いてる環境系でコンパイル という結論に達しました
761 :
デフォルトの名無しさん :04/04/24 03:50
enumって、#defeineでやるのとちがって、 「まちがって同じ数値を定義しちゃう」ことがないっていう利点がありますよね? で、ほかに利点ってありますか? たとえば、その型以外の変数にその値を代入したり比較したらエラーにしてくれるとか、 逆にその型で宣言した変数にそれ以外のものを代入したらエラーにしてくれるとか そういう機能はないのですか? あと、たとえば、型ごとに名前空間が別だとか、そういうのがあればいいのに。
>その型以外の変数にその値を代入したり比較したらエラーにしてくれるとか、 コンパイル時に警告出力しないか? >逆にその型で宣言した変数にそれ以外のものを代入したらエラーにしてくれるとか コンパイル時に警告出力しないか?
763 :
デフォルトの名無しさん :04/04/24 03:59
> これで、31.400000というのがprintされたんですけど、 円周率は3だろ。
764 :
デフォルトの名無しさん :04/04/24 04:02
> 小数点が必要だからって何故にdoubleなんてつかうんだ floatつかうやつはぼけ。 昔からのCのユーザーならかならずdouble使う。
765 :
デフォルトの名無しさん :04/04/24 04:04
> NULLはゼロと解釈してますが この場合どう違うのでしょう ちがいますゼロがNULLなんです。
766 :
デフォルトの名無しさん :04/04/24 04:05
> 値としては0だが、ポインタとしての0番地を表すのに使うためにある名前なので、 これは大うそ やーい > しったか
767 :
デフォルトの名無しさん :04/04/24 04:06
> NULLはNullポインタであって、ゼロではないです。 でもゼロはナルポインターです
768 :
デフォルトの名無しさん :04/04/24 04:12
>>762 VC++6.0ですが、-W3でも-W4でも出ませんよ > 警告
>>761 >たとえば、その型以外の変数にその値を代入したり比較したらエラーにしてくれるとか、
>逆にその型で宣言した変数にそれ以外のものを代入したらエラーにしてくれるとか
全く理解できない。enum型以外のenumって何だ?
要するにデータ型の問題ですか?
ポインタの0がぬるぽで
char型の配列に入ってるのはchar型の0
>>768 データ型に互換性があると、勝手にキャストするような...
* $FreeBSD: src/sys/sys/_null.h,v 1.5 2003/12/26 06:11:43 obrien Exp $
*/
#ifndef NULL
#ifdef _KERNEL
#define NULL (void *)0
#else
#if defined(__LP64__)
#define NULL 0L
#else
#define NULL 0
#endif
#endif /* _KERNEL */
#endif
winでCygwin使って書いてるんですけど、上手くいきませんのでご助言 お願いします。 状況 バイナリファイルを開こうとするとfopenに失敗する場合がある。 テキストファイルやexeファイルは上手く開けるが、JPGやMP3については 常に失敗してしまう。 なにが間違っているのでしょうか?