1 名前:デフォルトの名無しさん [2007/05/08(火) 19:39:26 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 11 pc11.2ch.net/test/read.cgi/tech/1176800483/ 過去スレ Part 1 ttp://pc8.2ch.net/test/read.cgi/tech/1146700389/ Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/ Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/ Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/ Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/ Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/ Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/ Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/ Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/ Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/ 関連スレ C/C++の宿題を片付けます 86代目 pc11.2ch.net/test/read.cgi/tech/1176996941/ くだすれC言語(初心者用) Part.2 pc11.2ch.net/test/read.cgi/tech/1172099763/ スレを勃てるまでもないC/C++の質問はここで 2 pc11.2ch.net/test/read.cgi/tech/1178503366/l50 はきだめC/C++下級者の質問箱 2 pc11.2ch.net/test/read.cgi/tech/1156206091/l50 【C 関数検索 man on WWW】 www.linux.or.jp/JM/index.html
82 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 13:37:48 ] sizeof自体がどうなってるか分かりませんか? あとC言語って自由に配列数を増やしたり減らしたり出来ない? 出来たらうれしい
83 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 13:45:54 ] rubyじゃないんだから・・・
84 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 13:59:39 ] >>82 sizeofは、コンパイル時にコンパイラが計算する。 配列要素数の増減はできないので、realloc()したりC++のvectorを使っ たり。
85 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 14:11:39 ] reallocというのは確保領域を変えるってことですか? それなら手間が増えるだけで増減可能ですね。 sizeofはライブラリではないんですか? sizeofはどうやって書かれているかを聞いています。
86 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 14:13:08 ] C++は使わないことにしています。 なぜならC++はC言語の拡張とはいえないからです。 オブジェクト指向としてはrubyがもっとも純粋であることは確かですし Cとの互換性が消えたので、linuxで使えません
87 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 14:28:35 ] オブジェクト指向としての純粋性を追求する事に何の意味が? Cとの互換性が不完全でもLinuxでC++は使えるが?
88 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 14:32:47 ] >>85 sizeof はコンパイラが解釈する演算子の内のひとつです。関数ではありません。
89 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 14:33:51 ] システムはCで書かれている。 C++では書かれていない。これは互換性が消えたことによるものである。 linuxといえばC言語 C++は窓用言語 rubyはクロスプラットフォームの純粋オブジェクト指向型言語
90 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 14:45:57 ] つまりLinuxのシステムだけを書くためにCを勉強中って事?
91 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 14:49:08 ] >>85 reallocはただの動的確保で配列関係ないから 配列の要素数増減は不可でFA
92 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 14:52:21 ] rubyではどうやって配列の要素数増減ができると見せかけられたかを考えてみるといいよ。
93 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 15:44:37 ] どうせRubyの事も大して分かってないんだろうな
94 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 16:05:07 ] それは俺も思った
95 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 16:06:07 ] 突っ込みどころがあり過ぎるが、たぶん釣りだからガマン。 うちの会社に来ないことを祈る。
96 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 18:09:22 ] >>91 メモリ確保した所を配列として扱うなら可能だと思うが。
97 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 18:52:22 ] 高級言語から入るとこれだからいかんな。 アセンブリ言語の洗礼を受けてくるといい。
98 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 18:59:53 ] >>97 すいません。8080, Z80, 6502, 6800, 68000 ぐらいまでしかやってません。 この頃の x86 系についてはよく分かりません。
99 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 19:00:42 ] 釣り来た
100 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 19:26:05 ] rubyはかなり分かってます。 linuxの為にCを勉強しています。当然です。ちなみにVine
101 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 19:27:04 ] 釣りくせー
102 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 19:29:37 ] 「かなり分かっています」 と自信を持って言う奴の 99% は、大して分かっていない。 なぜなら、言語の奥深さを知ってる者は、おいそれとそんな事は言えないからだ。 ほんの一握りのエキスパートか、Ruby 処理系の開発者か、 そうでなければ見栄っ張りの小物にしかそんな事は言えん。
103 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 19:48:15 ] というかこういうやつほどコテつけて欲しいな ただの騙りの可能性も否定できないし もしすべて本人だったらかなり・・・
104 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:05:58 ] Linux上で動くアプリケーションを作りたいだけなら、g++使えばいいだろうし、 Linuxのメジャーなディストリビュージョンなら、 g++がない(gccや下手したらccだけしかない)なんて状況を仮定する必要なんてないはず。 また、完全な互換性がない今のC++でも、それなりにCらしいコードも書けるし。 このスレで出てくるようなコードなら、ほとんどvoid*周りしか問題にならないと思う。
105 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:30:07 ] なんか勘違いしている香具師が多いようだが、Cでも可変長配列はあるぞ。 それから、malloc()などで確保した領域を配列のように運用することはできてもそれは配列じゃないぞ。 #まぁ、可変長配列も伸び縮みできるわけじゃないがな。
106 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:32:41 ] C99 なんてあってないような規格で語られてもな。
107 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:33:53 ] 意味わからん
108 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:38:23 ] >>106 身近なところではgcc, icc, SunのccがC99準拠なんだが。 後二者はデフォルトだし。
109 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:39:02 ] しかし、ほとんど使われていないのもまた事実。
110 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:40:00 ] 自分が使えないからといって、無闇に否定するのは如何な最中と。
111 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:40:08 ] お前が使ったこと無いだけ
112 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:42:20 ] >>105 どうやるんですか?可変長配列
113 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:42:49 ] VC が準拠しない限り、使用人口は増えない。
114 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:43:57 ] C99がOKでC++駄目ってのがよくわからん
115 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:43:59 ] >>112 ttp://seclan.dll.jp/c99d/c99d04.htm#dt19990719 つーか、なんで「C99」ってキーワードまで書かれてるのに 自分で調べようとしないんだろうな
116 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:46:11 ] 使った事ないんじゃなくて、使う気がしないだけ。
117 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 21:24:47 ] #include <stdio.h> int main (void){ int a[3]={1,2,3}; a[3] = 4; printf("%d\n", sizeof(a)/sizeof(a[0])); printf("%d\n", a[3]); return 0; } どうしてだお?
118 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 21:27:47 ] >>117 printf("%d\n", a[3]); // Access Violation
119 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 21:28:22 ] でないお gccだけど
120 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 21:29:30 ] どっちかっつーとこっちのがヤバい。 a[3] = 4;
121 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 21:30:05 ] size is 3 a[3] is 4 こうなったお
122 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 21:30:16 ] a[0] = 1; a[1] = 2; a[2] = 3] a[3] = ?
123 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 21:30:19 ] どうしてって何が?
124 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 21:31:27 ] 不変な表明ってこういうときに役に立つの?
125 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 21:37:05 ] Cに不変表明なんかないだろ。
126 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 00:32:21 ] assertがそれにあたるんじゃ
127 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 00:37:21 ] >>117 のなんて、そもそもインデックスと要素数の関係自体理解できてないんだから assertとかそういう次元の問題じゃないだろ あれは何かの拍子で変な値がインデックス用の変数に入り込んだりするのを発見するため
128 名前:31 [2007/05/10(木) 02:07:35 ] >>32 それはわかるんだけど、それから先が全くわからなくて・・・ というかまず何を書けばいいのかもわからない・・・ド素人でスマン。 助けて・・・
129 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 02:09:41 ] きもちわる・・・
130 名前:デフォルトの名無しさん [2007/05/10(木) 02:23:34 ] webマトリックスてなんすか? とりあえずGET,POSTとだけ言ってこ
131 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 09:18:45 ] アク禁
132 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 14:51:22 ] >>117 もしや a[3] = 4; の所で何かエラーが出て欲しかったのか? ま、しかし、C言語は元々そんな生易しい言語ではないのだよ。
133 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 15:03:16 ] だろうな しかしなんでコンパイラ通っちゃうのかよくわからん
134 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 15:04:13 ] そういうのでもコンパイルを通すように作られてるから
135 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 15:06:30 ] 文法的には正しいから
136 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 15:13:46 ] >>117 JavaとかC#とかしかやったことが無い人?
137 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 15:19:34 ] >>133 エラー出すようにするとコンパイラ作るのが面倒だろ
138 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 15:24:15 ] なるほどw 先頭要素のポインタさえありゃ動くからあとはシラネってことか
139 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 15:59:43 ] 仕様通り
140 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 15:59:53 ] indexに変数が入ってる場合に、その変数が取り得る値をチェックするには実行してみないと わからないんじゃ?
141 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 16:01:47 ] これを応用(悪用?)した技もあったしな 構造体の最後の要素を [1] にして、使いたい配列の大きさ分大きめにallocして使う いつからか 1 無くてもコンパイル通るようになってたっけな
142 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 16:18:20 ] JavaとかC#の配列だと境界チェックしてるから範囲外なら例外が投げられるけどCではそういうのが無いからね。 C#はLengthプロパティ使ってループ回す場合はチェックはオフになったり monoのC#コンパイラには配列境界チェックをしないようにするオプションがあったりするけど Cは常にチェック無し。 まぁチェックがある分安全で遅いか、無い分危険で速いかだな。Cは後者。
143 名前:デフォルトの名無しさん [2007/05/10(木) 16:48:32 ] switchが上手く動作しないのですけれど、何処が可笑しいのか教えて下さい /* もし小文字なら大文字を、大文字なら小文字を出力し エラーの後に再入力可否選択を要求する */ #include <stdio.h> #include <ctype.h> // islowerやtoupperなどが含まれる main () { char text; first: printf ("アルファベットを入力して下さい\n"); text = getchar (); // 大文字変換処理 if (islower(text)) { // islower = 小文字であるかを判定 text = toupper (text); // toupper = 大文字変換 printf ("入力されたアルファベットの大文字は %c です。" ,text); } else if (isupper(text)) { // isupper = 大文字であるかを判定
144 名前: ◆awSK7mC37A mailto:sage [2007/05/10(木) 16:49:33 ] // 小文字変換処理 text = tolower (text); // tolower = 小文字変換 printf ("入力されたアルファベットの小文字は %c です。" ,text); } else { // エラー処理 printf ("エラー\n" "アルファベット以外の値が入力されました。" "\n" "継続して入力しますか?\n" "Y/N"); text = getchar ();
145 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 16:50:09 ] switch (text) { /* switchが何故か機能しない 書式ミス? */ case 'Y': goto first; break; case 'N': goto end; break; } } end: return 0; } >>144 の名前は気にしないでください。。
146 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 16:59:12 ] switchの式って整数型に限られるんじゃ無かったっけ?
147 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 17:00:40 ] textはどう見ても整数型だろ
148 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 17:00:50 ] いや、別にこれでいいけど、2回目のgetchar() では最初のgetchar()時に 入力した2文字目を取ってきてるからこうなる。 具体的には改行だな。それ以外でも2つ以上入れてりゃ同じだ
149 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 17:51:56 ] alphabet以外の文字、たとえば 1 を入力してテストしてみると swtich文に入って行かない。きっと1の後ろに"\0"とかあって うまくゆかないのだろう。 text = getchar (); // ここで "\0" を喰わせる text = getchar (); // きっと入力待ち状態になるはず とか思ってしまったトーシローなのは俺だけでいいと思うんだ…orz
150 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 18:18:00 ] わざわざそんなこと書かなくてもいいよ
151 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 18:25:13 ] >>148 つまりどういうことですか?
152 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 18:36:47 ] >>151 つまり、余分な入力バッファはクリアする必要がある。 getchar() なら、'\n' が来るまで読み捨てるとか。 while (getchar() != '\n') ; 例えばこんな感じで。 fflush(stdin); は物議をかもしそうなのでお試しでw あとは、switch - case にdefault: は必要だと思うぞ、特に今回のは。
153 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 19:35:06 ] >>151 scanf(" %c", ...) を使う。
154 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 19:38:20 ] goto の使い所がダメな感じするな。 goto 使って見辛くしてどうする。 お前は昔の BASIC かと言いたい。
155 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 19:48:39 ] どうでもいいけどgotoつかったらbreak;いらなくね?
156 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 19:55:41 ] いらないが付けるクセはつけといてもいいかも あとそれ以前に慣れないうちはdefault付けるクセをつけといたほうがいいと思う
157 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 21:41:52 ] ANSI-Cを勉強してまだ日も浅いのですが 四則計算の 23 / 3 =7 アマリ 1 という風にアマリを出すにはどのようにすればいいのでしょうか?
158 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 21:42:09 ] mod
159 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 21:42:37 ] 普通に%じゃあかんのか?
160 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 21:42:46 ] %dane
161 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 21:43:44 ] %d姉
162 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 21:46:32 ] 〜〜省略〜〜 int a,b,c; scanf("%d",&a); scanf("%d",&b); c= a % b ; printf("%d % %d =%d\n",a,b,c); return 0; でいいのでしょうか?
163 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 21:47:58 ] だめ
164 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 21:48:10 ] > printf("%d % %d =%d\n",a,b,c); printf("%d %% %d =%d\n",a,b,c);
165 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 21:51:08 ] あとbが0かどうかもチェックしたほうがいいな。
166 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 21:51:31 ] >>162 bが0の場合どうするんだ?
167 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 21:53:19 ] 分岐か何かが必要なんですね、if 0〜〜とかそういう感じなんでしょうか
168 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 21:58:04 ] 聞く前にとりあえずコード書いてコンパイルしてみろ。
169 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 22:05:35 ] if (*s && isalpha(*s)) {...} が LinuxとSolarisで動作が違うのでgcc -Eで確認したらSolatisではisalpha(c)が ((__ctype+1)[c] & (0x01 | 0x02)) に展開されててLinuxではライブラリ関数呼んでました。 動作が違ったのは*sが負数になってたせいのようでした。(なぜ負のインデックスで__ctype配列 参照してcore吐かなかったか不思議ですが...)*sに入る整数値がなんでもありと すると、ここは普通どう書きますか? if (isascii(*s) && isalpha(*s)){...} とかすればOK?
170 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 22:11:18 ] >>164 %% って \n とかのエスケープシーケンスと同じものと考えておkですか?
171 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 22:12:19 ] >>170 エスケープシーケンスで例えるなら \\ やね。
172 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 22:13:43 ] >>169 is系関数に渡すときは unsigned char でキャストするのは定石。 もう多すぎて面倒なら、char を符号無しにするコンパイラのフラグを指定汁。
173 名前:デフォルトの名無しさん mailto:age [2007/05/10(木) 22:29:09 ] UNIX環境でCを書いています。 FILE *fp fp = popen("gnuplot", "w"); fprintf(fp, "plot sin(x) w lines \n"); pclose(fp); としてgnuplotを呼び出すプログラムを作りました。 今の状態では、gnuplotが立ち上がってsin(x)の関数が一瞬だけ表示され、 gnuplotが直ちに終了してしまいます。 どこにどのような処理をすれば、gnuplotを表示させたままに出来るのでしょうか? Enterキーなどを押すことで終了するようにしたいです。 よろしくおねがいします。
174 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 22:32:14 ] >>172 それだけだとSJIS の時は、 全角文字の2バイト目で真になる可能性があるな。 リードバイトの判定とかした方がいい。 >>169 は EUC みたいだから大丈夫だとは思うが。
175 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 22:48:20 ] >>173 system("gnuplot < data.txt"); とかじゃだめかな? data.txtはあらかじめ作っておく。
176 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 22:49:27 ] >>172 ,174 ありがとうございます。m(_;_)m >is系関数に渡すときは unsigned char でキャストするのは定石。 助かります。
177 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 23:27:12 ] >>173 とりあえず表示を残すだけなら "gnuplot -persist" とすれば良いけど、 グラフを表示しているプロセス(gnuplot_x11)のIDを 外部プログラムを使わずに見付けて殺す方法が分からん。
178 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 23:50:48 ] system("gnuplot ... &")ではダメ? 真面目にプロセス管理したいならfork()/exec*()を使う羽目になるけど。
179 名前:デフォルトの名無しさん [2007/05/11(金) 06:20:36 ] 初歩的な質問ですがお願いします。 strlenなどの文字列を扱う関数は引数としてchar型の文字列への先頭ポインタをとります。 つまり、strlen(s)とすると配列sの先頭アドレスが渡され、結果が返ります。 しかし、strlen("test")とした際も結果は出力されます。 この"test"という文字列はどのようにプログラム内部で扱われるのでしょうか? 自動的に一時的にメモリに確保されるのでしょうか? では宜しくお願いします。
180 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 07:31:33 ] >>179 exeファイルの中に入ってるでしょ 実行時にどう配置されるかはシステムによる プログラム上ではポインタとして扱われる
181 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 07:44:13 ] >>179 ほぼ、static const char foo[] = {'t', 'e', 's', 't', '\0', }; strlen(foo);と同じ。
182 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 15:35:08 ] クリリンのAAきぼん