1 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 22:34:33 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 19 pc11.2ch.net/test/read.cgi/tech/1190342593/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 97代目 pc11.2ch.net/test/read.cgi/tech/1191937213/
357 名前:デフォルトの名無しさん [2007/10/26(金) 00:26:59 ] fgetsで入力した後'\n'を消す方法はありますか? あまりポインタは使いたくないんですが・・・
358 名前:aho mailto:sage [2007/10/26(金) 00:29:26 ] >>350 構造体のポインタを利用してみました。 #include <stdio.h> typedef struct{ int hoge; int hage; int hige; int huge; }HOGE; int main(){ HOGE* hogep = NULL; try{ hogep = new HOGE(); }catch(...){ printf("new error!\n"); } /* メンバ変数の初期化 */ hogep->hoge = 1; hogep->hage = 0; hogep->hige = 1; hogep->huge = 1; printf("%d\n", hogep->hoge); return 0; }
359 名前:デフォルトの名無しさん [2007/10/26(金) 00:40:51 ] >>357 fgets(buf, n, fp); if (buf[strlen(buf) - 1] == '\n') { buf[strlen(buf) - 1] = '\0'; } ・・・?
360 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 00:44:21 ] >>357 fgets(buff, sizeof buff, stdin); for(i=0; buff[i]; i++) if(buff[i]=='\n') { buff[i] = '\0'; break;}
361 名前:デフォルトの名無しさん [2007/10/26(金) 01:39:24 ] C++Compiler / Turbo Debugger をzipから解凍したらフォルダに何も入ってなかったんだけど・・・ どこでパス入力するの?
362 名前:教えてください mailto:sage [2007/10/26(金) 03:23:34 ] C言語についての質問です。 下記の素数か素数でないか調べるコードで、 @変数名にis_primeとありますが、isは何を意味しているのですか? Ais_prime = 1;とするのがわかりません。 B以下、return 0; まで、どういう流れかわかりません よろしければ1行ずつ教えてもらえるとうれしいです。 #include <stdio.h> int main(void) { int num, i, is_prime; printf("判定したい数を入力してください: "); scanf("%d", &num); /* 約数があるかどうか調べる */ is_prime = 1; for(i=2; i<=num/2; i=i+1) if((num%i)==0) is_prime = 0; if(is_prime==1 && num > 1) printf("素数です"); else if (num > 1) printf("素数ではありません"); return 0; }
363 名前:デフォルトの名無しさん [2007/10/26(金) 03:44:59 ] num is_prime なんだろ
364 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 08:08:18 ] >>362 適当な数字入れて処理追いかけてみろよ。
365 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 08:13:38 ] なんにもわかってないってことかよw
366 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 11:02:57 ] >>362 You is fool.
367 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 11:26:14 ] >>361 解凍しなおしてみたら?
368 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 12:54:26 ] You are Shock!
369 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 13:24:17 ] atofとか解読できなさそうだな
370 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 13:55:39 ] 数値計算において 不等号の>>と>の判別ってプログラム的にどうすべきですかね? 計算は対数でするんだけど。
371 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 14:35:43 ] 差が閾値を越えるかどうかで判定 もしくは比が閾値を越えるかで判定
372 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 15:09:54 ] その問題では>>と>=で計算方法違うんだよ。 今計算してみると対数の値をexpかけてみて値をみていくと 値がかわってくるのが差が10から15あたりのときみたいだから 閾値を15で計算をかえてみることにするわ。
373 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 15:49:02 ] for(;loc<100;loc++){ if(loc<100){ printf("氏名を入力して下さい(空白で終了):\n"); fgets(data[loc].namae,39,stdin);←この行 if(!*data[loc].namae)break; printf("電話番号を入力して下さい:\n"); fgets(data[loc].denwa,39,stdin); printf("市外局番を入力して下さい:\n"); fgets(str,9,stdin); data[loc].sigai=atoi(str); } } 上の行のfgetsをgetsに変えるとEnterでbreakするんですけど fgetsのままでは動作しません。どうすればfgetsのままで動作しますか?
374 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 16:10:04 ] >>367 何回解凍しなおしてもダウンロードしなおしても空… zipファイルはちゃんと容量あるのに解答してできたフォルダには容量が全くなくなる。
375 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 16:15:36 ] >>374 解凍ソフトは何? パス付きに対応してないやつなんじゃね?
376 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 16:17:32 ] >>373 fgetsは改行も取り込むから、 fgets(data[loc].namae,39,stdin); if(data[loc].name[0] == '\n') break; これでおk
377 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 16:26:35 ] >>376 出来ました。ありがとうございます。
378 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 16:30:47 ] fgetsの解説ですが ohmoriws1.ms.kagu.tus.ac.jp/1997/sotsuken/miyakosi/c04.html ここは間違ってる?もしくは誤解される様な感じなのですか・・? 一度参考にしたんですが・・。
379 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 16:46:34 ] >>378 '\n'を取り除くとも書いてないから間違いとは言えない。 しかし、その直後のfputs()の説明が間違っているから信用できない。
380 名前:デフォルトの名無しさん [2007/10/26(金) 17:20:43 ] すいません超絶初心者な僕に教えて頂きたいことがあるます 1行64バイトのファイル(行数可変)のデータに何回も文字列の検索を行ういアウトプットするプログラムを作っています。 fgetsを使い何回もファイルを読み込んで一行ずつ比較するというようにできたにはできたのですが、 行数可変で多い場合100000行超えたりするファイルに対してはえらい時間がかかります。 メモリにぶちこんでそこから何回も検索を行いたいと思うのですが、どう組んだらいいでしょうか。
381 名前:これ参考に [2007/10/26(金) 17:37:47 ] #include <stdio.h> #include <time.h> #include <string.h> int N; void serch(char* x,char* str,int* adr){ char t[256];int n,M,k,su=0; for(M=0;;M++)if(str[M]=='\0')break; for(n=0;n<256;n++)t[n]=M; for(n=1;n<=M;n++){k=(unsigned char)str[M-n];if(t[k]==M)t[k]=n;} n=0;while(1){ for(k=0;k<M;k++)if(str[k]!=x[n+k]) break; if(k==M){adr[su]=n;su++;n+=M;} else {k=(unsigned char)x[n+M];n+=t[k];} if(n+M>=N){adr[su]=-1;return;}}} main(){ N=18000000;char *x=new char[N];N=0; char buf[120],k,n; FILE *fp=fopen("2ch.txt","rb"); while(k=fread( buf,1,100,fp)){ for(n=0;n<k;n++)x[N+n]=buf[n];N+=k;} fclose(fp); printf("データロード完了!\n測定中です・・・\n"); int adr[30000]; char str[]="名無し"; serch(x,str,adr); }
382 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 18:07:20 ] >>381 変数の使い方、変数の名前が気持ち悪い >>380 malloc,realloc使うべし
383 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 18:08:40 ] あ、いや、バイナリならftellとfseekでサイズが分かるから、 reallocはいらないやも
384 名前:デフォルトの名無しさん [2007/10/26(金) 18:24:22 ] >>381 さん ありがとうございます >>382 さん mallocを使った場合どのように組めばいいでしょうか?
385 名前:デフォルトの名無しさん [2007/10/26(金) 18:35:14 ] 一番簡単な方法おしえてやる
386 名前:デフォルトの名無しさん [2007/10/26(金) 18:36:04 ] >>375 ありがとう。 解凍ソフト変えたらできた。
387 名前:デフォルトの名無しさん [2007/10/26(金) 18:53:06 ] #include <iostream> #include <string> #include <fstream> using namespace std; int main() { fstream fp("test.txt"); string str,buf; do{ fp >> buf; str+=buf; }while((!fp.eof())); int n=str.find("会議"); cout << n; }
388 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 18:53:49 ] >>381 だからその入力ロジックを何とかしろって
389 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 19:06:04 ] >>384 適当に書いた例だけど FILE *fp; char *data; ... //省略 data = (char*)malloc(sizeof(char) * 128); /とりあえずchar128個分確保 if(data==NULL) return 1; //エラー処理 int i=0,size=128; while((data[i] = getchar()) != EOF){ if(++i >= size){ char *tmp; tmp = realloc(data,sizeof(char) * (size + 50)); //50ずつ拡張 if(tmp == NULL){ /* reallocは元の領域を解放するが、失敗時は解放せずにNULLを返す そのため、失敗時に解放できるように、別変数で一度戻り値を受けてから、エラーチェックする */ free(data); //mallocやreallocで確保した領域は必ず解放する return 1; } else { data = tmp; size += 50; } } } free(data) //必ず解放
390 名前:デフォルトの名無しさん [2007/10/26(金) 20:26:58 ] #include<stdio.h> int A; int B; void X(int a[],int b[]){ printf("%d",a); printf("%d",b); } void main(void){ //省略 X("A","B"); 質問させてください 変数A Bを引数使って表示させたいんですけど、コマンドプロンプト?で実行させると警告がでてちゃんと表示されません。 どうすればいいでしょうか? 説明不足ですみませんがよろしくお願いします
391 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 20:29:39 ] 関数の引数としてポインタを渡して、そのポインタの変数に値をいれているのですが、 関数を呼び出す時によって、値をいれる必要が無いときがあります。 不要な値のために変数を宣言したくないのですが、変数を宣言しないでいい方法などはありませんか? hoge( &x, &y, &height, &width); と呼び出すのですが、&heightと&widthの結果を使わないときもあるので、 int x, y; だけ宣言して、heightとwidthは変数宣言したくないと思っています。
392 名前:デフォルトの名無しさん [2007/10/26(金) 20:30:26 ] 型がヘンすぎる 勉強不足
393 名前:デフォルトの名無しさん [2007/10/26(金) 20:31:42 ] >>391 C++は入れない場合も同じ名前に出来る 2つ書けばいい
394 名前:デフォルトの名無しさん [2007/10/26(金) 20:33:40 ] int hoge( a, b, c, d);を定義して たとえばcとdを使わないなら、hoge( a, b) { return hoge( a, b , 0 , 0);}
395 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 20:34:45 ] >>391 NULL を使えばいいと思うよ >>393 ここはC言語のみ C++なら誘導してからにしてください
396 名前:391 mailto:sage [2007/10/26(金) 20:39:55 ] >>393 すみません、C言語です。 >>394 すみません。 私が関数ではないため動作が変えれないのと、不必要な値は6この引数のうち、 1, 2, 5が不要になったりする場合もあります。 >>395 すみません。 NULLを使うと言うのは、どのようにすればいいのでしょうか? 型を、castするという意味でしょうか?
397 名前:391 mailto:sage [2007/10/26(金) 20:48:00 ] 連続投稿失礼します。 hoge( &x, &y, NULL, NULL); とすれば、コンパイルは通ったのですが、これは正しいのでしょうか? 簡単に動作を説明して頂けるとありがたいです。
398 名前:デフォルトの名無しさん [2007/10/26(金) 20:50:47 ] >>397 動作はNULLで通るように自分で書かなければ行けない
399 名前:391 mailto:sage [2007/10/26(金) 21:26:43 ] >>398 > 自分で書かなければいけない と言うのは、関数をそのように修正すると言うことでしょうか? 関数は自分で作ったもので修正はできないと思います。
400 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 21:27:56 ] >>399 NULL の指す先を読み書きしないようにするだけ
401 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 22:00:33 ] >>399 hoge()の仕様がわからないと、引数でNULLを渡していいかどうかは判断できない。
402 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 22:44:08 ] heightとwidthは>>391 が使わないというだけでhogeは内部で値を設定しようとするからNGだと予測する俺エスパー
403 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 22:51:54 ] まともな関数ならチェックしてるだろうけど・・・
404 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:01:40 ] 昔はチェックしてたけど不定値渡されて以来チェックするのをやめた
405 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:10:28 ] >>404 あなたが hoge() か
406 名前:デフォルトの名無しさん [2007/10/27(土) 00:15:31 ] #include <stdio.h> int f(int &x){ if(&x==NULL) return -1; return x+10;} int main(){ int x=0; printf("%d\n",f(x));}
407 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:23:05 ] >>406 それじゃポインタ渡した意味な(ry
408 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:29:32 ] -1がreturnされることってある? てか参照渡しってCで使えるの?
409 名前:デフォルトの名無しさん [2007/10/27(土) 00:38:22 ] #include <stdio.h> int f(int *x){ if(x==NULL) return -1; return *x+10;} int main(){ int x=0; printf("%d\n",f(NULL));}
410 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:42:57 ] それがどうしたと言わざるをえない
411 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:45:11 ] assert(p != NULL); で十分。
412 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:50:42 ] assertと引数チェックは違うんだぜ・・・
413 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:30:01 ] 引数チェックが一番の使いどころだろ > assert()
414 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:34:02 ] >>413 へぇ、永遠のデバッグビルドか
415 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 09:58:07 ] >>414 sunも引数チェックにassert使えって言ってるよ。
416 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 10:40:38 ] それは引数を渡す方も一緒に開発してる時だろ 内部的なエラーでも無い限りNULLになる事はありえない前提
417 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 11:38:55 ] 自分で作ってるライブラリじゃなくても、仕様にNULLを渡した時の動作が書いてなかったら、 NULLを渡すなんてありえない。
418 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 16:10:15 ] 引数チェックはやって当然。
419 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 16:15:39 ] 両方書いておけばおk
420 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 16:20:57 ] ポインタで渡される引数のチェックって NULL比較?
421 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:39:12 ] mallocとかポインタがわけわかりません。 図とかでイメージしやすく解説してください
422 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:44:10 ] >>391 カリー化
423 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:45:58 ] >>421 本読め
424 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:46:25 ] mallocって char *str; /* 文字列のためのメモリを確保 */ str = (char *)malloc(100); こんな感じに書いてるけど char str[100] ってやった方が楽じゃん。なんでmallocなんて使うの?
425 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:49:17 ] >>391 型が分からなかったので適当に決めた int hoge_wrap(int *x, int *y, int *width, int *height){ int dummy=0; if(x==NULL) x=&dummy; if(y==NULL) y=&dummy; if(width==NULL) width=&dummy; if(height==NULL) height=&dummy; return hoge(x, y, width, height); }
426 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:50:10 ] >>424 必要ないなら無理して使わなくても良い物です
427 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:52:55 ] >>426 無理して使えるようになるためにおせーてよ 何か新天地が開けるかもしれないじゃん というか教えてくださいお願いしますガンダム見ませんから
428 名前:デフォルトの名無しさん [2007/10/27(土) 17:56:59 ] newやvectorつかえば十分 性能も変わらない
429 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 17:58:13 ] char型で考えるから分かりにくいことになる。
430 名前:デフォルトの名無しさん [2007/10/27(土) 18:00:08 ] char だと領域確保に制限がある new mallocは巨大なのが出来る
431 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 18:00:14 ] newやvectorがわからないっす
432 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 18:04:55 ] >>427 char array[100]; のかわりにchar *p; p=(char*)malloc(100);を使うとき 1.配列のサイズが未定のとき 実行時にしかか配列のサイズ(この場合100)がわからないとき 2..配列のサイズが大きすぎて内部変数として確保できないとき 外部変数を使うという手もある
433 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 18:05:28 ] ここって C++ ありだっけ?
434 名前:デフォルトの名無しさん [2007/10/27(土) 18:09:53 ] char型だと巨大配列を確保できない #include <iostream> #include <vector> using namespace std; #define N 10000000 main(){ int *x; x=new int[N]; vector<int> y; y.reserve(N); // char z[N];z[0]=1; for(int n=0;n<N;n++)x[n]=y[n]=1; printf("%d",x[0]);}
435 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 18:10:55 ] >>433 なし
436 名前:デフォルトの名無しさん [2007/10/27(土) 18:11:16 ] mallocとnewに性能の違いはなく、vectorはちょっと高性能でちょっと動作に負担がかかる
437 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 18:30:06 ] (ノ∀`) アチャー
438 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 18:58:41 ] >>418 状況による。 たまにいる、必ずやるってやつは素人。
439 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 19:23:20 ] >>424 配列サイズが分からなかったり、途中で増える可能性がある時に使う
440 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 19:35:21 ] >>438 やらないとLintに叱られます
441 名前:プリンがー mailto:aaa [2007/10/27(土) 19:55:12 ] 問題を解く時、まず問題を見て引数があるかないかってどうやって分かります?
442 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:02:57 ] 問題ってのが仕事上の問題なのか学校で先生に出された問題なのかによる
443 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:03:16 ] エスパー!! エスパー!!
444 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:07:27 ] >>440 そんなlintありません。
445 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:21:30 ] >>434 スタックサイズを増やせばおk ま、普通はポインタにして malloc するがな
446 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:37:47 ] >>424 char str[100] の[]の中に変数を入れるとコンパイルエラーになるが、 mallocだとそれができます。
447 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:42:54 ] コンパイラによってはエラーにならないけどな
448 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:55:01 ] C99
449 名前:プリンがー mailto:aaa [2007/10/27(土) 22:06:09 ] >>442 学校で先生に出された問題ってか演習問題とか
450 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 23:11:41 ] >>449 コンピュータじゃないんだから人間的に考えればいいと思うよ
451 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 23:16:35 ] 入力として必要なものは引数なんじゃね
452 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 00:19:56 ] 1 getchar() を用いて 1 文字入力を行い、Ctr+Z が入力されるまで次の処理を繰り返しなさい。 大文字、小文字に関係なく、アルファベットを入力した場合には、それぞれの入力した個数を数えなさい。 2. 1. の処理終了後、アルファベットをそれぞれ何個ずつ入力したか出力しなさい。 これなんですがどう頑張っても意味不明です・・・ ヒントとして ?入力アルファベットの個数を数えるカウンタは大きさ 26 の配列で用意。 最初に、配列の 26個の要素すべてを0クリアすること。 ?A〜Z、a〜z は ASCIIコードの 65〜90、97〜122 に該当することを考えれば、配列の何番目をカウントUP するかは計算で求められるはず。 実行結果 入力文字 14abcaaabccdzzgk(リターン) aabc147cab8cc3c(リターン) CTRL+Z(リターン) とすると a = ○○個 b = ○○個 c = ○○個 改行 d = ○○個 e = ○○個〜〜〜 と一覧を出力させたいんです。 とあるんですが、どう書いたらいいんでしょうか・・・('A` switch使ってみたりしたんですが、イマイチ意味がわからなくなってきました・・・。 ちなみに今まで習った事は、 if if else for while break continue goto 算術関数 strcpy等、 等の初歩的なことだけです。。。
453 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 00:22:10 ] >>452 宿題スレ行け
454 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 00:25:32 ] どこがわからないのかが分からないが 65-65は0 90-65は25 97-97は0 122-97は25 ってことじゃね
455 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 00:25:45 ] 今まで習った事の中にgotoがあるのが気になる・・・ 普通初心者にgotoは教えないだろ
456 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 00:25:56 ] >>152 宿題スレに行け……と言いたいところだがヒントをやろう 'a'-'a' == 0 'z'-'a' == 25 'A'-'A' == 0 'Z'-'A' == 25
457 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 00:29:12 ] goto嫌いな人ってbreakとかcontinueとかも嫌い?