- 1 名前:静的領域の名無しさん mailto:sage [2008/08/12(火) 18:23:10 ]
- C言語の入門者向け解説スレです。
教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題を片付けます 114代目 pc11.2ch.net/test/read.cgi/tech/1216746971/ ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 33 pc11.2ch.net/test/read.cgi/tech/1217073697/ 過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
- 21 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:55:05 ]
- >>11
3件しかデータがないなら、オーバヘッドがある分確実にqsort()は無駄です。 >7 LSI-Cは整数型が16ビットしかないので、学習には全くお勧めできません。 >>18 memcmp()でできますが、自分でループを書いたほうがいいかも知れません。
- 22 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:55:23 ]
- >>21
自分でループを書いたほうがいい理由はなんですか?
- 23 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:58:43 ]
- >>22
自分でmemcmp()に辿り着けないレベルなら、勉強になるジャマイカ。
- 24 名前:11 mailto:sage [2008/08/12(火) 21:05:43 ]
- >>19 >>21
そういわれればはそうですね。
- 25 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:20:58 ]
- char *buff1,*buff2;に
strcat(buff1,buff2)ってできませんか?
- 26 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:22:39 ]
- buff1がbuff2をコピーしうるだけの十分なバッファを指してれば可能
- 27 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:24:26 ]
- 実行したらエラーになりました・・・
対策を教えてください
- 28 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:26:11 ]
- >>27
実行しない
- 29 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:26:30 ]
- >>25
できますが、事前に充分な格納場所を割り当てることを忘れずに。
- 30 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:30:57 ]
- buff1に実体がないとエスパー
- 31 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:02:52 ]
- うまくできません・・・
buff1="abc"; buff2="testtest"; みたいに結合前に代入しているんですが・・・
- 32 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:08:25 ]
- >>31
だからbuff1に十分な場所がないとだめだとみんなが。 そもそもそれ以前の話だけどね
- 33 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:12:03 ]
- そのbuff1の領域をあらかじめ広げておく方法がわかりません。
それ以前の話とはchar buff1="abc"; この宣言がよくないですか?
- 34 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:14:14 ]
- 広げるっていうのは
char buff1[256]; とか[]の中の数字を大きくするか mallocで動的に確保するかしかないよ
- 35 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:15:42 ]
- たぶん色々わかってないから説明が必要なんだろうけど、
俺ツタヤ行くから誰かが教えてくれるはず
- 36 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:16:05 ]
- realloc()でもすれば?
- 37 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:21:11 ]
- >>36
質問内容から察するに 前提条件から書かないと 質問者には意味が分からないはず
- 38 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:30:39 ]
- realloc()があればmalloc()もfree()もいらない。
- 39 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:32:48 ]
- >>38
何を言っているんだ?
- 40 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:34:18 ]
- とりあえず、今日はみんな寝よう
- 41 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:36:48 ]
- char * foo = realloc(NULL, 100); // same as char * foo = malloc(100);
realloc(foo, 0); // same as free(foo);
- 42 名前:7 mailto:sage [2008/08/12(火) 22:39:30 ]
- >>16 >>21
65535までの数しか扱えないみたいですね。 でも、今週から本買って始めた超初心者ですので、とりあえずこれで頑張ってみます。
- 43 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:40:03 ]
- >>41
なるほど勉強になった。で、何の話だっけ?
- 44 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 23:02:47 ]
- >>42
別にMSの回し者じゃないが 個人的には>>6が良いと思うけどなぁ
- 45 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 23:40:48 ]
- rubyみたいに!?も関数名に使えたら便利なのに・・・
- 46 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 23:44:17 ]
- たとえばなにがどう便利になると言うのか
- 47 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 00:18:51 ]
- 関数の外に影響する関数には最後に!つけたり、真偽を返す関数には?をつけたりして可読性をあげるんだよ。あれ便利じゃん?
- 48 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 00:21:46 ]
- そんなもん自分で勝手にサフィクスでもプレフィクスでもつければすむことだろう
- 49 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 00:32:12 ]
- !?がもっともシンプルでもっともわかりやすいんだよ
- 50 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 00:35:19 ]
- >>49
その代わりに否定の!と三項演算子がつかえなくなるのはいやなんですが。
- 51 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 00:38:05 ]
- lispみたいに関数名の最後にpをつければいいじゃん
- 52 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 00:42:31 ]
- >>51
ctype.h関数群の is〜、もありますね。
- 53 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 00:54:37 ]
- >>49
そんなものはただのお前の好みであって便利でもなんでもない
- 54 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 01:06:02 ]
- >>50
いや、使えるだろ・・・ くっつけて書かなければ
- 55 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 01:08:37 ]
- いちいち空白を入れるのはうざい・・・そう思っていた時期が俺にもありました
- 56 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 02:25:39 ]
- >>54
そう作ればそうでしょうけれども。 現在の仕様では識別子の文字セットと演算子として使用する文字とはまったくかぶらないのでひっつけてかいてもOKなのです。
- 57 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 02:47:53 ]
- !がどういう関数につくのかよくわからないが、?に関しては関数名で自明になるように作るでしょ。
Is〜 Has〜みたいにさ。 ?がついたからわかりやすいんだ!という向きにはひまわりでもやってなさい、といいたい。
- 58 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 06:21:41 ]
- まさか関数の命名規則に不満がある人がいるとは思わなかった
- 59 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 07:41:37 ]
- コンパイル前にsedで変換すりゃいいだけじゃん。
あ、ゴメン、そういうの出来ないのか、そりゃ〜悪かった。
- 60 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 07:54:36 ]
- >>59
IDE使っててそういう発想がなかったのだろうよ。或いはMakefileを書けないとか。 それはさておき。 今のところ$と@は使われていないけれど、変数名なんかに使えたっけ?
- 61 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 08:57:58 ]
- [a-zA-Z_][a-zA-Z0-9_]*
- 62 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:43:24 ]
- 処理の進行状況を表示したいのですが、
1% 2% ・ ・ 100%みたいに表示するのではなく "1"% ""この数字だけ次々更新していく方法はないんですか?コンソールプログラムです
- 63 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:47:53 ]
- >>62
www.kumei.ne.jp/c_lang/intro/no_59.htm
- 64 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:48:57 ]
- 簡易的に、\nじゃなくて\r使うとか
- 65 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:51:30 ]
- >>62
標準関数では無理 対象となるコンソールのスペックによる
- 66 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:58:49 ]
- \rでできました。ありがとうございます
- 67 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:19:19 ]
- うわ、いくらこのスレでも>63と>65はものの見事に恥かきっ子w
- 68 名前:65 mailto:sage [2008/08/13(水) 11:20:30 ]
- >>67
いや、べつに
- 69 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:25:29 ]
- 間違ってもいいから、とにかくいう
- 70 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:31:07 ]
- 最後の行という限定条件があるけどね
- 71 名前:デフォルトの名無しさん [2008/08/13(水) 11:36:11 ]
- 柴田望洋の明解C言語って本を借りてきたんだけど
エディタはどれを使えばいいの? visual C++ってのが無料の統合開発環境らしいんでそれを使おうと思ってるんだけど それでいいですか? CとC++の違いがオブジェクト指向どうこうかいてあったけど プログラムは初めてで何の事だか・・・
- 72 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:38:52 ]
- 本が今ひとつであることと、VisualStudioでは標準でC++を作らせようとしていることを除けば特に問題ないかと。
取り敢えず、ソースファイルの拡張子はcppにしないように気をつけてね。 PC自体の知識と意欲があるならLinux使うなりCygwin入れるなりを薦めるけどね。
- 73 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:39:58 ]
- >>71
それでいいよ ファイルの拡張子を .c にすればCとして処理される。 標準関数が安全じゃないと警告が出るときがあるけど
- 74 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:40:12 ]
- \r知らないくらい許してやって
- 75 名前:71 mailto:sage [2008/08/13(水) 11:46:14 ]
- >>72
linuxとかが開発に向いてるってのは聞いたことあるけどプログラム初めてなんで とりあえずお手軽なとこで・・・ >>73 初心者がちまちまやってる分には特に問題なさそうですね どうもありがとうございました。さっそくインストールしてみます。
- 76 名前:デフォルトの名無しさん [2008/08/13(水) 11:53:19 ]
- 勝ち誇りage
- 77 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 15:08:34 ]
- VSEE入れてコマンドラインからcl叩く分にはlinuxでgcc使うのと大して変わらんと思うがなあ
IDEを使うと便利なんだけど、IDEを使えるようになるまでの苦労というものが初心者にはあるから。。
- 78 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 19:43:09 ]
- 私もVisual C++ 2008 Express Editionをインストールしてみました。
いろんなサイト見て、ひとつ練習にプログラムを作りました。 そのあと次に新しいものを作るとき、また最初からプロジェクトとか 作る必要があるのでしょうか。「新規作成→ファイル」で作れると思ったのですが… 新しいプログラムを作るやり方を教えてください。よろしくお願いします。
- 79 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 19:46:24 ]
- >>78
新規プロジェクトでまずいことでも?
- 80 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 19:57:23 ]
- >>79
いえ、毎回プロジェクトから作っていく以外に方法があるのかと思った次第です。 例えば、同じプロジェクトの中に新しいファイルを作って保存したりできないかと… 毎回新しくプロジェクトを作るのが当然のことでしたらそれでやるしかありませんので。 特に問題ありません。 今、いつくかのサイトで調べてみましたら、 「作成される実行ファイルは、一つのプロジェクトにつき一つだけです。 」と書いてありました。 毎回プロジェクトから作る必要があるみたいですね。
- 81 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 20:01:08 ]
- >>80
> 例えば、同じプロジェクトの中に新しいファイルを作って保存したりできないかと… それは可能ですよ。だけど、main関数のあるファイルは追加しない。 追加するとどうなるんだ?mainが2つあるというエラーメッセージが出るんじゃないかな?
- 82 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 20:12:24 ]
- いいかげんスレ違い
pc11.2ch.net/test/read.cgi/tech/1217525513/1
- 83 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 22:18:19 ]
- VC++で拡張子が.cのものをコンパイルすると
1>cl : コマンド ライン error D8045 : C ファイル '.\Test.c' を /clr オプションと共にコンパイルできません とエラーになることがあるんですけど対処法を教えてください。
- 84 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 22:19:56 ]
- 素人すぎるだろ
プロジェクトとmain関数の意味ググってこいやボケ
- 85 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 22:43:21 ]
- >>83
Win32プロジェクトを作れ
- 86 名前:デフォルトの名無しさん mailto:yosi0517@gmail.com [2008/08/13(水) 23:15:52 ]
- Cを覚えるまえにベーシックをやっていたんですがベーシックの頃の癖が抜けません。やはりCから入ったほうがよかったのでしょうか?
- 87 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:17:50 ]
- ベーシックの頃の癖ってなんだ?
- 88 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:19:47 ]
- 後藤とか?
- 89 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:20:18 ]
- グローバル変数じゃないか
- 90 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:23:33 ]
- たとえばPRINT""って書いてみたり
- 91 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:25:43 ]
- 整数の変数をI%にしちゃうとか
- 92 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:28:22 ]
- for i=0 to 9 とか
- 93 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:30:03 ]
- どうせポインタがわからないとかそういうんじゃねーの?
READ/DATAは当然ないし
- 94 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:30:42 ]
- >>84
1プロジェクト複数exeを期待したんだと思うよ コマンドラインから入ったら結構そう期待してしまいそう
- 95 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:31:27 ]
- 行の最初に 10 20 30 とか
- 96 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:32:28 ]
- 言語の違いなんて気にスンナ
ベーシックとFORTRANとC++とJavaとアセンブラの仕事を同時並行した俺がいる こつ、覚えすぎないことw
- 97 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:33:11 ]
- GOSUBとかON ERROR GOTO とかかな
- 98 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 00:33:54 ]
- 行番号じゃないのか
- 99 名前:sage [2008/08/14(木) 02:38:20 ]
- カンマ区切りのデータを配列に移すとき、
例)abc,def,ghi,jkl.... 皆ならどういう風にするのでしょうか? 条件) ・strtokはなし。 ・分かりやすさ重視。
- 100 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 02:41:59 ]
- そんなもん頭から解釈していく意外にやることなかろう
- 101 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 02:45:18 ]
- 先頭から一文字ずつチェックしてカンマを検出したらその直前までの文字列を格納できる領域を割り付けてコピー以下繰り返し
以外にまっとうで安全な方法があるなら聞きたいわ
- 102 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 02:48:23 ]
- >>101
元データを丸ごと領域確保&コピーしてカンマを\0に置換していったほうがいいんじゃないか?
- 103 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 02:53:32 ]
- strtok使いたくない理由は引用符を特別扱いするからか?
それとも多バイト文字を扱うからか? いずれにせよ状態を保持しながら先頭から手動で一文字ずつチェックする以外ないな
- 104 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 03:08:59 ]
- awkだと考えるまでも無いんだけどね...
1)複数の、文字列のポインタを格納できる領域を確保(固定サイズである程度大きいものor区切りの数を数える) 2)元の文字列のコピーを作成,区切りを'\0'に置き換えつつ、1)の領域へ区切りの先頭アドレスを格納していく って感じかな
- 105 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 03:13:54 ]
- #include <stdio.h>
#include <string.h> #include <stdlib.h> int main() { int i, arrylength; char basestr[] = "abc,efg,hij,klm, , asjelrhaesh"; char **arry; char *temp; i = 1; temp = basestr; while (temp = strchr(temp, ',')) { temp++; i++; } arry = (char**)malloc(sizeof(char*) * i); arrylength = i; i = 1; temp = basestr; arry[0] = temp; while (temp = strchr(temp, ',')) { *temp = '\0'; temp++; arry[i] = temp; i++; } for (i = 0; i < arrylength; i++) puts(arry[i]); return 0; } 異論は認める
- 106 名前:デフォルトの名無しさん [2008/08/14(木) 03:26:02 ]
- for(i=0;i<len;i++){
if(data[i]==','){ j++; continue; } strncat(array[j],data[i],1) }
- 107 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 07:52:20 ]
- カンマで区切るだけでいい(ダブルコーテーションを考慮しない)のなら、sscanf()で%[^,]するのが一番簡単だろ。
カラム数が固定じゃないなら、%[^,],%nで。
- 108 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 08:06:22 ]
- 分かりやすさ重視(速度やメモリ効率は無視)なら考えるまでもない。
char** tokbycomma(const char* src) { char** result = NULL; char* tmp; while((tmp = cutbycomma(src)) != NULL){ result = pushback(result, tmp); src += strlen(tmp) + 1; free(tmp); } return result; } cutbycommaとpushbackをどう作ればいいかは自分で考えましょう。
- 109 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:20:04 ]
- typedef struct{
double a[10]={0.0} char *mozi; }HOGE; HOGE data[200]; これで宣言したらaは初期化されていますか?
- 110 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:24:56 ]
- コンパイルしてみればいい。
typedef struct{ double a[10]={0.0} char *mozi; }HOGE; この段階だと実態は無いのでできない?
- 111 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:25:47 ]
- そうですね。できませんねー
- 112 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:28:51 ]
- 書くならこっちじゃね?
HOGE data[200]; でも仮にかけたとしても200個とか手で書くのか? どうせchar*もNULLでないと困るんだしどこかで memset(data,0x00,sizeof(data)); としておけば全部0でクリアになるよ
- 113 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:31:09 ]
- char * cutbycomma(const char * src)
{ char * tmp = malloc(strlen(src) + 1); int pos; int rtn = sscanf(src, "%[^,\n]%n", tmp, & pos); if (rtn != 1) { /* 抽出不可 */ free(tmp); return NULL; } if (src[pos] != '\0') /* 継続あり */; return tmp; }
- 114 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:31:25 ]
- typedef struct{
double a; char *mozi; }HOGE; 構造体はこうでした・・・ for(i=0;i<200;i++){ data[i].a=0.0; } とするのではどっちが早いですか?
- 115 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:34:00 ]
- memset()でdoubleが0になることは規格では保証されていない。
それでもいいなら、自前で代入するよりも速いかもしれない。
- 116 名前:112 mailto:sage [2008/08/14(木) 09:35:42 ]
- あ、そっかdoubleか、すまん0x00でうめるのはまずいな。
intとか整数型ならいいかもしれんが実数はやめたほうがいい。 よって>>114のループで
- 117 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:46:18 ]
- >>113
毎回使いもしない長さの領域を確保してるじゃん。10点。
- 118 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:56:03 ]
- 皆さんのレベルに到達するのに何年ぐらい必要ですか???
- 119 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 10:41:01 ]
- >>118
ひとそれぞれですし、取り組んだ課題によりさまざまな指向性を示すと思いますが、そんなことより、とりあえずやってみましょうよ。
- 120 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 10:44:11 ]
- for(i=0;i<num;i++){
if(条件){ 処理 break; } } この場合のbreak;はif文から抜けるだけですか?それともfor文からも抜けますか?
- 121 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 10:52:39 ]
- for
|

|