- 1 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 06:14:52 ]
- C言語の入門者向け解説スレです。
・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 14 pc11.2ch.net/test/read.cgi/tech/1181735298/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 91代目 pc11.2ch.net/test/read.cgi/tech/1182607405/
- 129 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 14:13:40 ]
- unsigned char にキャストして sprintf で %%%02X すりゃいいと思うけど、
sprintf を使う場合はバッファオーバーフローに注意だな。 別にこの程度なら自前で変換してもいいんだけどね。
- 130 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 14:32:11 ]
- >>126-129
ありがとうございます、>>128さんの言うとおりでした >>129さんを参考にしてやってみます
- 131 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 14:47:25 ]
- 質問です。
C言語って色々命令作れる前に、最初からhファイルを読み込んで使える、 いわばインストール時に標準搭載されている命令ってあるじゃないですか。studio.hのprintfやmath.hのsqrtとか ああいう命令を分かりやすくどんな用法で使えばいいのかが全て網羅してある 本またはサイトはありますか?
- 132 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 14:49:28 ]
- >>131
標準ライブラリ関数でぐぐれ
- 133 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 14:53:42 ]
- >>131
JIS
- 134 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 15:15:53 ]
- >>131
命令て。 まず入門書くらい買え。
- 135 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 15:16:24 ]
- ああ、「本または」って書いてあるね。すまんすまん。
じゃ、「作ってわか(ry
- 136 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 17:01:07 ]
- >>132-135
ありがとうございます。参考になりました
- 137 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:05:46 ]
- 文字列の数字を消したいプログラム(例えばAB1C9をABC)をつくりたいんですけど
下のソースではうまく消えません。もしよければどのようにすればいいか指導お願いします。 #include <stdio.h> void kesi(char *str){ char c; while(*str!='\0') { c=*str; if(c<'0'||c>'9'){ //数字でないならば *str=c; } str++; } } int main(void){ char str[100]; scanf("%s",str); kesi(str); printf("%s",str); return 0; }
- 138 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:12:34 ]
- 消した分だけ後ろの文字列を前に詰めないといけない。
void kesi(char *str) { char *to = str; while (*str != '\0') { char c =*str; if (!isdigit(c)) { *to = c; to++; } str++; } *to = '\0'; }
- 139 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:23:48 ]
- 138さん返信ありがとうございます。 char *toとしてますが、
またポインタ宣言しなければ、ダメなんでしょうか?? あと初心者なのでisdigitとかまだよくわからないです…。もしよければアドバイスおねがいします
- 140 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:27:42 ]
- 宣言しなきゃコンパイルできないし、isdigitはググれば山ほど出てくる
- 141 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:30:57 ]
- 137のソースではただのchar c; としてポインタで宣言しないでも
コンパイルは通ったんですけど…なぜポインタを使うのかよくわからなくて…。
- 142 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:32:55 ]
- 138では、詰める前の文字を指すのにstrを使い、
詰めた後の文字を指すのにtoを使っている。
- 143 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:39:59 ]
- ポインタを使わないと、どこに文字をいれていいかわからないから
- 144 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:42:04 ]
- >>142さん、わかりやすかったです!ポインタの理由が理解できました!
- 145 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 21:15:37 ]
- >>98
でも有名な話ですよね。
- 146 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:02:40 ]
- キューのプログラムで
#define QUEUE 5 static int i = 0; i = (i+1)%QUEUE; で次の添字が得られる とか書いてあるんですが、よくわかりません。 常にiは0である気がするんですが、どこが間違っています?
- 147 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:13:33 ]
- (0+1) % 5 == 1
(1+1) % 5 == 2 (2+1) % 5 == 3 (3+1) % 5 == 4 (4+1) % 5 == 0 (0+1) % 5 == 1
- 148 名前:デフォルトの名無しさん [2007/06/28(木) 00:16:59 ]
- 初期化とキーボード入力以外で文字列を一回で代入する場合はstrcat()しかないですよね?
- 149 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:21:51 ]
- そんなことないよ
- 150 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:22:37 ]
- >>147
ありがとうございます。 ですがもう少し。 a%bってあったら「aをbで割った余り」ですよね? だとすると、 (0+1)%5 = 1%5 = 0? ではないのですか?
- 151 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:23:13 ]
- >>149
何がありますか? 教えてください
- 152 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:23:30 ]
- って書いたらわかりました。
スレ汚しごめんなさい。
- 153 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:23:51 ]
- 1÷5
1は5で割り切れないので終了。余り 1
- 154 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:24:31 ]
- strcpyとか
- 155 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:27:32 ]
- >>151
strncat,strcpy,ctrncpy,sprintf,sscanf ざっと思いつくのでこの程度。 あと、可変個引数使うときにある、printfのやつ。 あんま使ったこと無いから忘れたけど、vsprintfだっけ?
- 156 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:28:03 ]
- >>152
どちらさまですか?
- 157 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:28:28 ]
- >>150
おぬしは間違いなくstaticについて理解していない。 なぜstaticが付いているのかを考えるのじゃ
- 158 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:02:20 ]
- 質問です。
BASICのgotoみたいな命令はないのでしょうか?
- 159 名前:デフォルトの名無しさん [2007/06/28(木) 01:02:33 ]
- Cで書いてコンパイルしたファイルを人に送ってもその人は実行できないんですか?
というかできなかったのです。一瞬だけ実行されてすぐ消えてしまいます。 どうすればいいかわかりますか?
- 160 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:05:29 ]
- >>158
gotoというそのまんまの命令がある loop: printf("test"); goto loop; みたいに使う >>159 コマンドプロンプト経由で使えばおk
- 161 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:06:30 ]
- あ、ちなみにif文で条件を満たしていなかったらmainの一番上まで戻るというのがやりたいのですが・・・・
- 162 名前:デフォルトの名無しさん [2007/06/28(木) 01:10:52 ]
- >>160
そのファイル名のみを相手のコマンドプロントでコマンドさせるってことですか?
- 163 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:12:28 ]
- 構造体とポインタはどちらのほうが理解するのが難しい?
- 164 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:13:18 ]
- >>161
int main(void){ start: 〜いろいろな処理〜 if(条件を満たしていない) goto start; 多分普通の人であれば int main(void){ do{ 〜いろいろな処理〜 }while(条件を満たしていない);
- 165 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:13:31 ]
- おつむのレベルによる。
- 166 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:14:04 ]
- >>162
渡したファイルはexe? コマンドプロントで、exeのあるディレクトリに移動して実行すればオケ。
- 167 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:15:06 ]
- >>163
一般的にはポインタが難しいと言われる。
- 168 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:16:06 ]
- >>162
1.コマンドプロンプトを起動してもらう 2.コマンドプロンプトにexeファイルをドラッグアンドドロップしてもらう 3.Enterキーを押してもらう これが一番手軽だと思う
- 169 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:17:32 ]
- >>167
ポインタって何に便利なの?
- 170 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:18:24 ]
- 何に便利とか言い出すから一向に理解できないんだろ。
- 171 名前:デフォルトの名無しさん [2007/06/28(木) 01:19:15 ]
- >>166
>>168 ありがとうございました
- 172 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:20:43 ]
- >>169
必要にならないと分かりにくいと思う
- 173 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:24:36 ]
- >>169
Nバイトの構造体配列をソートして並び替えることを考える。 このとき、Nバイトのコピーが頻繁に発生することになる。 構造体に対するポインタの配列として保存していた場合、ポインタのソートで済むことになる。 例えばポインタが4バイト、構造体が100バイト超とかで配列が1000超とかだとすれば どちらが効率的かはわかるよね?
- 174 名前:デフォルトの名無しさん [2007/06/28(木) 01:24:45 ]
- Cpad for Borland...ってやつで書いてるんですけどexeファイルがありません。
どうすればいいですか? 171と同一人物です
- 175 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:29:33 ]
- >>170
お前がその便利さを知らない、説明できないだけだろ?えせプログラマは こんなところで質問者をたぶらかしてないで、へちょいプログラマで満足してろよ?
- 176 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:29:34 ]
- >>174
ファイルを保存している場所と同じ場所にexeファイルがあると思われ
- 177 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:30:55 ]
- >>175
へちょくないあなたがへちょい>>170の代わりに答えてあげてください
- 178 名前:デフォルトの名無しさん [2007/06/28(木) 01:34:22 ]
- >>176
あるにはあるのですが、ドラッグアンドドロップはできませんし、 そのディレクトリに移動して 〜.exe と打っても実行されません
- 179 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:40:02 ]
- >>178
コマンドプロンプトって何かわかってるか?
- 180 名前:デフォルトの名無しさん [2007/06/28(木) 01:42:45 ]
- なんか全体的に黒いやつですよね?
わかってるつもりです
- 181 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:43:02 ]
- ja.wikipedia.org/wiki/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88
- 182 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:45:17 ]
- >>180
「notepad」って打ってメモ帳が起動するか? ドラッグアンドドロップでフルパスが表示されて、エンター押して実行できると思ったんだけどなぁ
- 183 名前:デフォルトの名無しさん [2007/06/28(木) 01:48:14 ]
- >>182
メモ帳はでてきます。 でもファイルをドロップしようとすると○の中に×が入ってるようなのが出てきて できません
- 184 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:49:57 ]
- もしかしてvistaか?
- 185 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:50:51 ]
- >>183 ちょっwwwwwww伏字エロいwwwwwwwww
ティ○ポの中にオ×コが入ってるようなので とか妄想しちゃうぞwwwww
- 186 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:51:04 ]
- >>183
xpとかだとドラッグアンドドロップできないようになってるのかな? じゃぁあきらめてフルパス(c:\cpad\test.exeみたいなやつ)を打って実行するべし 入力面倒だけど。
- 187 名前:デフォルトの名無しさん [2007/06/28(木) 01:54:18 ]
- >>186
Vistaですよ。 かなりめんどいってことですね〜〜… ありがとうございました
- 188 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:55:23 ]
- VistaはD&Dできないのか・・・ ひとつ勉強になった。
- 189 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:56:12 ]
- セキュリティ云々でできなくなったそうだ
- 190 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:57:04 ]
- なぁ〜〜に、こうすりゃええがな。XPを仮想PCにインストール。仮想PCでプログラミング
あっ武勇伝、武勇伝、武勇でんでんででんでんっ♪
- 191 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 02:41:46 ]
- ポインタが無かったらprintfすら・・・
- 192 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 02:43:50 ]
- ファイル操作も出来ないね
- 193 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 03:03:13 ]
- そもそもポインタって何?実体は?それが理解できていないとダメ。
ja.wikipedia.org/wiki/%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF
- 194 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 07:10:08 ]
- 2つの文字列を指すポインタ(例えばs1はABC、s2はABを指してる)で
下のソースコードだと2つの文字列が改行にいくまで繰り返すって言う意味ですかね? while((*s1 != '\n') || (*s2 != '\n')) {〜〜 s1++; s2++}
- 195 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 07:12:03 ]
- (;^ω^)恐ろしいコード
- 196 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 07:18:58 ]
- すいません、ちょっと適当に書き込んだんで…。
ホワイルの中身の意味が知りたくて。
- 197 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 07:21:18 ]
- >>194
そのロジックだと、s1、s2の改行文字の位置が揃っていないと誤動作しそうだが。 #つーか、>194自身が挙げたサンプルで死亡確定だな。
- 198 名前:デフォルトの名無しさん [2007/06/28(木) 07:57:55 ]
- >>194
s1にもs2にも改行コードないからプログラム起動して即吹っ飛ぶ。 s1がABC\n、s2がAB\nだったとしても一致しないのでやっぱり吹っ飛ぶ。 そのコードはs1とs2の改行コード位置が一致した場合にループ抜ける。
- 199 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 08:00:03 ]
- 〜〜の中にきっとbreakが含まれてるんだ
- 200 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 08:45:23 ]
- C言語の精度って小数点以下いくつなんでしょうか??
- 201 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 08:49:39 ]
- そういう精度の決まり方じゃない。
これの IEEE 方式。 ttp://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0
- 202 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 08:50:57 ]
- 言葉が足りなかった。
IEEE 方式のマシンが多い、と。 別にエクセス 64 のマシンでも C は使える。 C かどうかで決まるものではなく、 CPU が何かによって決まるもの。
- 203 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 10:07:58 ]
- うん、それで、小数点以下いくつなんでしょうか??
- 204 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 11:11:40 ]
- >>203
>>201に書いてあるだろ
- 205 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 11:14:24 ]
- >>203
だから小数点以下いくつという形の精度じゃないと。 「浮動」小数点ってのは、そういう事だ。
- 206 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 12:07:34 ]
- 有効桁数って、確か中学で習うよな…?
- 207 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 14:02:25 ]
- 10進数だとIEEEの64ビット浮動小数点は小数点以下15桁ぐらいかな。
但しそれに掛ける10のn乗という指数が付くわけだが。
- 208 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 14:16:16 ]
- 有効桁数15〜16桁あたりだな。
本当は2進数で考えないといけないんだけど。
- 209 名前:207 mailto:sage [2007/06/28(木) 14:21:03 ]
- #include <stdio.h>
#include <values.h> int main(void) { printf("%d, %Lg, %Lg\n", sizeof(long double), LDBL_MAX, LDBL_MIN); printf("%d, %g, %g\n", sizeof(double), DBL_MAX, DBL_MIN); printf("%d, %g, %g\n", sizeof(float), FLT_MAX, FLT_MIN); return 0; } gcc 4.1.1 (i386-redhat-linux) で上記のソースをコンパイルして 動かすと結果はこう出る。 12, 1.18973e+4932, 3.3621e-4932 8, 1.79769e+308, 2.22507e-308 4, 3.40282e+38, 1.17549e-38 e から後ろの部分が指数で「掛ける10のn乗」を表す。 3.3621e-4932 は 3.3621 掛ける10の -4932 乗だ。 但し上記の結果は環境依存で、同じ gcc でもコンパイルオプションに よっては変わってしまう。だから全てについてこうであるという保証は できない。(values.h も gcc 独自のヘッダかも知れない)。ただ大雑把に 言えることは float よりは double、また double よりは long double の方が多くの範囲をカバーできるかも知れないというだけだ。 (コンパイラによっては long double はないかも知れないが)。
- 210 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 17:00:08 ]
- ISO準拠の処理系ならlong doubleは必ずある。
209が使っている定数は<float.h>で提供されている。
- 211 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 17:01:51 ]
- long double は必ずある。
しかし、double と同じサイズのこともある。
- 212 名前:デフォルトの名無しさん [2007/06/28(木) 17:10:52 ]
- putchar関数の意味がよくわかりません。
質問が抽象的すぎてごめんなさい
- 213 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 17:12:06 ]
- 標準出力に文字(char)を一文字出力(put)する
- 214 名前:デフォルトの名無しさん [2007/06/28(木) 17:42:10 ]
- …?
putchar('\n') ってのはどういうことですか?
- 215 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 17:48:00 ]
- 標準出力はわかるか?
通常は画面だと思っていい。 \n はわかるか? 改行コードをあらわすエスケープシーケンスだ つまり、画面上で改行する、ということ
- 216 名前:デフォルトの名無しさん [2007/06/28(木) 17:50:19 ]
- それは
printf("\n") とは違うんですか?
- 217 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:07:45 ]
- printf は文字列を扱う
たまたまprintfで1文字出力するなら、putchar と同じ様になるな。 でも、printf の第一引数の文字列は % とか入ると違ってくるけどな。
- 218 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:08:09 ]
- "\n" は文字列
'\n' は文字
- 219 名前:デフォルトの名無しさん [2007/06/28(木) 18:31:55 ]
- でもこの場合では意味することは同じなんですよね?
というか、putcharでできることはprintfでもできるんですか?
- 220 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:32:55 ]
- できるけど、効率は悪い。
- 221 名前:デフォルトの名無しさん [2007/06/28(木) 18:35:29 ]
- それは打つ文字数が多くなるとかいうレベルの話ですか?
プログラムの内容には関係ないですよね?
- 222 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:36:12 ]
- あります。
- 223 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:40:48 ]
- printf は文字列を解析して
% が出てきたらどうするかとかいう処理を行ってる。 ま、出力自体のコストに比べりゃ微々たる差だがね。
- 224 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:41:45 ]
- 適材適所だ
printfで全部まかなうのもいいし、使い分けるのもいい。 同じことができるなら、片方はまったく無駄だと思ってるなら それはキミが初心者だから。
- 225 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:42:18 ]
- 最近のコンパイラは賢いから、>>216なんかはputchar('\n');に最適化されるけどな。
- 226 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:43:47 ]
- そこまでするのか! っていう最適化が
意外とされてるんだなあ。
- 227 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:48:02 ]
- gccは printf("%s\n", "hoge"); を puts にしてくれたりするよね。
- 228 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:52:36 ]
- >>227
こういうのってどうやって知るんですか? ○は□に最適化されるとか
- 229 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:55:28 ]
- 逆アセンブルしてもいいし、
両方のパターンを書いてコンパイルして バイナリ比較して等しくなるかどうか確認したのでも。
|

|