トップページ⇒tech
1001コメント273KB

C言語なら俺に聞け! Part 112

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/08/08(月) 01:32:01
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

C言語なら俺に聞け! Part 111
http://pc8.2ch.net/test/read.cgi/tech/1121657911/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
0027デフォルトの名無しさん2005/08/08(月) 18:53:18
>>24
そのいい加減な変数名もだるー
0028デフォルトの名無しさん2005/08/08(月) 18:59:30
int a, b, c, d, e, ,i ,j;
0029デフォルトの名無しさん2005/08/08(月) 19:00:39
ひいぃぃ。やめてやめて
0030デフォルトの名無しさん2005/08/08(月) 19:11:06
よく一文字変数にiってみるんだけど
なんか理由あるの?
0031デフォルトの名無しさん2005/08/08(月) 19:13:57
>>30
fortranはIからNで始まる変数名は整数型と決まっていた。
その頃からの流れで、Iterationの頭文字でもあることから
basicやCでも未だにi一文字の変数名が幅を利かせている。
0032デフォルトの名無しさん2005/08/08(月) 19:14:36
iterator の i だったり int の i だったり、習慣や慣れだったり。
0033デフォルトの名無しさん2005/08/08(月) 19:25:07
iterator では it 派の漏れ
0034342005/08/08(月) 19:50:47
質問です。
ファイル読み込みの時に1行ずつファイル名を書いて読み込ませるのが、とても面倒臭く苦しんでおります。
ファイル名に数字を入れてループ文を使い一気に読み込ませる方法があると聞きましたが詳しいやり方がわかりません。
すみませんが、教えてください。
0035デフォルトの名無しさん2005/08/08(月) 19:53:35
>>34
書いてるまんま
0036デフォルトの名無しさんNGNG
>>34
そのファイルの命名に、規則性があれば、いくらでもやりようがあるけど。
0037342005/08/08(月) 19:57:51
自分の考えではファイル名をa*.txtという風にして*を0からの数字にしようと思っているのですが、

for(int i=0;i<10;i++)
{
ファイル読み込み("a"+i+".txt");
}
のようにやってみたのですがうまく行きません。
まいりました・・。
0038デフォルトの名無しさん2005/08/08(月) 19:58:46
sprintf()って知ってる?
0039デフォルトの名無しさん2005/08/08(月) 19:58:52
>>37
君は阿呆なのか?
0040デフォルトの名無しさん2005/08/08(月) 19:59:08
>>38
知ってるけど?それで?
0041デフォルトの名無しさん2005/08/08(月) 19:59:47
ファイル名をsprintf()で作れよw
0042デフォルトの名無しさん2005/08/08(月) 19:59:53
+i+ってなに?
始めてみた
0043デフォルトの名無しさん2005/08/08(月) 20:00:19
初めて・・・ orz
0044デフォルトの名無しさん2005/08/08(月) 20:00:27
>>37
しかもfor-statementで変数宣言ですか
0045デフォルトの名無しさん2005/08/08(月) 20:00:55
>42
ベーシックとかスクリプト系ではよくみかけるな
0046デフォルトの名無しさん2005/08/08(月) 20:01:10
>>44
それは別に問題ないだろ
0047デフォルトの名無しさんNGNG
>>37
とりあえず、入門書の一冊でも読んでください。
0048デフォルトの名無しさん2005/08/08(月) 20:01:36
>>44
0049デフォルトの名無しさん2005/08/08(月) 20:01:45
>>45
どういう意味なの?
0050デフォルトの名無しさん2005/08/08(月) 20:02:31
>49
文字列編集だよ
0051デフォルトの名無しさん2005/08/08(月) 20:02:45
forの中で宣言したらforの中のローカル変数になるんだっけ?
0052342005/08/08(月) 20:02:57
すみません。知りません。
そのsprintfについて少し調べてみます。
0053デフォルトの名無しさん2005/08/08(月) 20:05:53
>>46
処理系によってスコープ範囲が違うからあまり使わないようにしてます。

>>51
初期のころはfor-statementが出てきたところのスコープの末尾まで。
改定された規格ではforの中だけ。
未だにこれ引きずってる処理系はあります。
0054デフォルトの名無しさん2005/08/08(月) 20:10:33
>53
>初期

for(int i=0;i<10;i++)
{
...
}
for(int i=0;i<10;i++)
{
...
}

これがエラーになるのはどう考えてもバグだろw
改定だぁ? はぁ?
0055デフォルトの名無しさん2005/08/08(月) 20:10:55
>>53
そうです
0056342005/08/08(月) 20:14:32
やはり、どうすれば良いのかわかりません。
皆さんの討論にすらついて行けません・・・。
とにかく"a0.txt"と"a1.txt"と"a2.txt"をループ文で一気に読み込めればよいのです。
一番簡単な方法を教えてください。

くだらないと思った人は無視してください。
身勝手な申し出ですみません。
0057デフォルトの名無しさん2005/08/08(月) 20:16:01
だからsprintf()でファイル名を編集汁!
そのファイル名を使う!
0058デフォルトの名無しさん2005/08/08(月) 20:16:12
>>56
sprintfだっていわれてるだろ
0059デフォルトの名無しさん2005/08/08(月) 20:18:53
FILE *fp;
char filename[256];
for(int i = 0; i < 10; ++i)
{
  sprintf(filename, "a%d.txt",i);
  fp = fopen(filename, "r");
    ;
  fclose(fp);
}
0060デフォルトの名無しさんNGNG
>>53
改定されたのってC++の話でしょ。
0061デフォルトの名無しさん2005/08/08(月) 20:25:49
C99規格で,変数の宣言の位置に関してはC++風になりました.
0062342005/08/08(月) 20:26:01
>>59
ありがとうございます。
自分の知らないプログラムを見ると、そんな手があったか〜と毎度思ってしまうほど鮮やかです。
毎度と言えるほどプログラムを書いた事はありませぬが。
本当にありがとうございました!!
0063デフォルトの名無しさん2005/08/08(月) 21:18:23
+i+って・・・ここはJavaScriptのスレじゃないんだが・・・
0064デフォルトの名無しさん2005/08/08(月) 21:29:31
>>63
>>63
>>63
0065デフォルトの名無しさん2005/08/08(月) 21:30:37
そこはJavaって言ってあげるとこだろ
0066デフォルトの名無しさん2005/08/08(月) 21:34:44
お馬鹿
0067デフォルトの名無しさん2005/08/08(月) 22:23:19
HTMLのなかからリンクだけを取り出す関数というかライブラリはありますか?
0068デフォルトの名無しさん2005/08/08(月) 22:35:54
regex
0069デフォルトの名無しさん2005/08/08(月) 22:55:24
>>67
ありました
0070デフォルトの名無しさん2005/08/08(月) 22:57:41
>>68
正規表現でどうしろっていうの?
自分で抜けって事?

>>69
過去形なのはどういう意味?
0071デフォルトの名無しさん2005/08/08(月) 23:03:41
>>67
char* path = (ファイルパス)
char html[MAX_HTML];
char url[MAX_URL]
char *link_begin, *link_end;
FILE* fp;

fp = fopen(path, "r");
fread(html, sizeof(char), MAX_SIZE-1, fp);
fclose(fp);
link_begin = html;
while((link_begin = strstr(link_begin, "href=\"") != NULL) {
  link_begin += 6;
  link_end = strchr(link_begin, '\"');
  *link_end = 0;
  strcpy(url, link_begin);
  *link_end = '\"';
  }
  (目的の処理)
  link_begin = link_end+1;
}

適当に書いてみた。
0072712005/08/08(月) 23:05:30
while((link_begin = strstr(link_begin, "href=\"") != NULL) {
ミス。括弧が足りなかった。
while((link_begin = strstr(link_begin, "href=\"")) != NULL) {
0073デフォルトの名無しさん2005/08/08(月) 23:09:21
いろいろと問題有だな
0074デフォルトの名無しさん2005/08/08(月) 23:14:57
最後の中括弧はなんだ?
0075712005/08/08(月) 23:16:46
余計な中括弧が残ってたかorz
恥かくだけだからもうやめるわ
0076デフォルトの名無しさん2005/08/08(月) 23:42:28
>>71
うちも書いて欲しいから
めっちゃ応援してる
頑張って書いてくれ
0077デフォルトの名無しさん2005/08/09(火) 00:08:48
じゃ、変わって失恋プログラマがいきます。
/*ノーワーニング、ノーエラーなら彼女がよりを戻しに来る*/
//"href=\""があるか調べる
char *ishref(char *str)
{
int len[2], i, cmp;
char *ret;
len[0] = strlen("href=\"");len[1]=strlen(str);
cmp = -1;
for(i=0;i+len[0]<len[1]&&cmp!=0;i++){
cmp = strcmp("href=\"", str);
if(cmp==0){
ret = str+i+len[0];
}else{
ret = NULL;
}
return ret;
}

void folink(FILE *fo, FILE *fhtml)
{
char ss[256];
char *p[2];
while(fgets(ss, 256-1, fhtml) != NULL){
if((p[0]=ishref(ss))!=NULL){
p[1]=p[0];
while(*p[1]!='\"')p[1]++;
*p[1]='\0';
fprintf(fo, p[0]);
}
}
}
0078デフォルトの名無しさん2005/08/09(火) 00:11:45
cmp = strcmp("href=\"", &str[i]);
だった・・・
もう駄目だな。。
0079デフォルトの名無しさん2005/08/09(火) 00:19:42
これどうなってんの?
0080デフォルトの名無しさん2005/08/09(火) 00:21:03
>>79
読むと失恋する
0081デフォルトの名無しさん2005/08/09(火) 00:23:11
失恋したorz
0082デフォルトの名無しさん2005/08/09(火) 00:40:19
ねえマスター、作ってやってよ
涙忘れるソース
0083デフォルトの名無しさん2005/08/09(火) 00:42:20
ねえマスター、
ねえマスター、
ねえマスター、はやくぅ
0084デフォルトの名無しさん2005/08/09(火) 00:49:28
誰もがhref="と空白を空けずに書くと想定するのは如何な最中と。
0085デフォルトの名無しさん2005/08/09(火) 00:53:24
MSHTMLでも使えってことですね
0086デフォルトの名無しさん2005/08/09(火) 02:06:31
>>77
void main(void) {
printf("ガンガレ!\n");
}
0087デフォルトの名無しさん2005/08/09(火) 02:19:01
http://freshmeat.net/projects/htmlcxx/
http://freshmeat.net/projects/libhtmlparse/
0088デフォルトの名無しさん2005/08/09(火) 04:11:10
htmlcxx ってC++じゃなかったか?
0089デフォルトの名無しさん2005/08/09(火) 07:14:03
char *ishref(char *str)
{
  char target[] = "href=\"";
  char *ret;
  int targetlen = strlen(target);
  int len = strlen(str);
  int i, j, k;
  j=0;
for(k=0;k+targetlen<len;){
  for(i=0;i<targetlen;){
   while(isspace(str[j])){j++;k++;}
   if(str[j]==target[i]){
    i++;
   }else{
    break;
   }
  }
}
  if(i==targetlen){
   ret = str + j + 1;
  }else{
   ret = NULL;
  }
}

こうかー
0090デフォルトの名無しさん2005/08/09(火) 08:57:16
完全な初心者です。
C言語を覚えたいのですが、環境を整える段階で早くも詰まっています。
Visual C++、gcc、LSI C-68等のコンパイラでオススメの物を教えて下さい。
当方、windousXPです。
0091デフォルトの名無しさん2005/08/09(火) 09:11:38
>>90
スレ違い。VCでもgccでもいいけど、整備の仕方が判らないなら該当スレへどうぞ。
LSI-Cは無条件に薦めない。
0092902005/08/09(火) 09:30:58
>>91
ここかと思っていました、すみません。
スレ違いなのに答えてくださってありがとうございます。
0093デフォルトの名無しさん2005/08/09(火) 20:06:26
質問です。
int unko(int a, int* b, int c) {
 return a+*b+c;
}

int (*ok)(int a, void* b, int c);
ok = unko;

としてもコンパイルエラーにはならないのですが、(gccだとデフォで警告orz)
これは一般的なテクニックとして利用しても大丈夫なのでしょうか?
0094デフォルトの名無しさん2005/08/09(火) 20:08:29
すみません、void* をプロトタイプに持つ関数のポインタに、
その位置にvoid* 以外の型のポインタ変数を持つ場合でも、
コンパイルエラーにならないってことです。
0095デフォルトの名無しさん2005/08/09(火) 20:11:19
一般的なテクニックだあぁ?
おまえのオナニーテクニックだろ
unkoの型をvoid*に合わせて演算するところでintにキャストせぇよ
なにがやりたいんだかわからん
0096デフォルトの名無しさん2005/08/09(火) 20:15:59
いや、何がやりたいかは別に分かってもらわなくても良いのですが、
この様な使い方(プロトタイプに合ってない関数をキャストなしで代入)は
すべきじゃないかを問いかけただけです。

>unkoの型をvoid*に合わせて演算するところでintにキャストせぇよ
すみません。例が意味不明でした^^
これはあくまで単なる例なので、気にしないでください。
0097デフォルトの名無しさん2005/08/09(火) 20:16:59
for(〜〜){
  if(〜〜){
    if(〜〜){
      break;
    }
  }
  hoge++;
}

これでbreakが実行されるとforから抜けることになるんですか?
それとも外側のifを抜けてforのhoge++が実行されるのでしょうか?
0098デフォルトの名無しさん2005/08/09(火) 20:19:34
errnoでセットされた値はプログラマが明示的に
クリヤーする必要があるんですか?
0099デフォルトの名無しさん2005/08/09(火) 20:23:07
>>97
まずはおまえ自身でやってみろよ
なんだかもう・・・
0100デフォルトの名無しさん2005/08/09(火) 20:25:11
すいません。友人の家でふと疑問に思ったのです。
書き込みも友人のPCなのでコンパイラをインストできないんです。
今日は泊まりなので家にも帰れませんし。。
0101デフォルトの名無しさん2005/08/09(火) 20:26:25
>>100=>>97です
0102デフォルトの名無しさん2005/08/09(火) 20:28:50
べつに急ぎじゃないんだろ?
帰ってから思う存分やれ
0103デフォルトの名無しさん2005/08/09(火) 20:31:10
>>98
1.errnoは、エラーになったときだけセットされる
2.errnoは、エラーになったときだけ参照する

1.2.より、通常は明示的にクリアする必要は無い
0104デフォルトの名無しさん2005/08/09(火) 20:33:27
>>101
調べると「ループやスイッチ」が対象みたいなのでforから抜けるみたいですね。
どうもでした
0105デフォルトの名無しさん2005/08/09(火) 20:37:20
ところでさ、なんで break の対象は ループや「スイッチ」 なんだろうね。
switch文を抜けるのまで 同じ「break」 である必要はあったのかね・・・
sbreak とか、別ものにして欲しかったと思うことは無いか?

答えろ! >>107!
0106デフォルトの名無しさん2005/08/09(火) 20:39:42
>105
厨房は黙ってろよ
0107デフォルトの名無しさん2005/08/09(火) 21:05:27
>>105
黙ってろ
0108デフォルトの名無しさん2005/08/09(火) 21:09:33
>別ものにして欲しかったと思うことは
ないな。以上
0109デフォルトの名無しさん2005/08/09(火) 21:14:51
>>105
ない。あとおまえは黙ってろ
0110デフォルトの名無しさん2005/08/09(火) 21:16:40
breakじゃなくてgotoにしてほしかった。
0111デフォルトの名無しさん2005/08/09(火) 21:18:34
>>93
一般的なテクニックではないな。
Cはそういうところのチェックが甘いし。
0112デフォルトの名無しさん2005/08/09(火) 21:23:21
>>107
ひどいじゃん
0113デフォルトの名無しさん2005/08/09(火) 21:24:24
>>106
forやwhileの中で、switch文の中からbreakしたくなったことは
一度も無いのか?
0114デフォルトの名無しさん2005/08/09(火) 21:25:41
goto
0115デフォルトの名無しさん2005/08/09(火) 21:26:20
>>93
テクニックというには、使いどころが無さ杉な気がする。
0116デフォルトの名無しさん2005/08/09(火) 21:26:47
breakなんswitch以外で使わなければいい
俺は全部gotoにしてる
0117デフォルトの名無しさん2005/08/09(火) 21:27:54
で、うじうじそんなことを考えてどうするつもりかね。
0118デフォルトの名無しさん2005/08/09(火) 21:30:39
>>111
やはりそうですか。ありがとうございました。

>>115
ポインタをコールバックで渡すとき、
呼ばれた側だけが型の情報を知っている場合に、
別の変数にキャストしなくてもいいので便利かな、と思いまして。
0119デフォルトの名無しさん2005/08/09(火) 21:32:33
>>117
ストールマンとコンパやって、やつが酔っ払ってる隙に
gccのソースを直す。
0120デフォルトの名無しさん2005/08/09(火) 21:35:38
>>116
俺は極力goto使わないようにしてる
「gotoレスプログラミング」っていうぐらいだし
0121デフォルトの名無しさん2005/08/09(火) 21:41:11
俺は極力 後藤 使わないようにしてる
「後藤カスプログラミング」っていうぐらいだし
0122デフォルトの名無しさん2005/08/09(火) 21:48:59
でも多重breakしたいときには仕方がないから使う。
0123デフォルトの名無しさん2005/08/09(火) 22:02:24
gotoレスくらい、ほとんどの人が分かり切ったこととしてるはずじゃないのかいな。

多重ループを脱出するときは、「仕方がない」という意識ではなく、ここぞ使う場面だ
と思って使うが。
01241222005/08/09(火) 22:11:06
>>123
JavaとかDにはラベル付breakなるものがあるらしい。これなら多重breakにgotoを使う必要がなくなる。
これがないCでは「仕方なく」gotoを使うことになる。もちろんラベル付breakをCに導入しろとは全然思っていない。
俺はJavaもDも使ったことがないけど。
0125デフォルトの名無しさん2005/08/09(火) 22:11:47
>>123
そういう場面になったら俺の場合、gotoを使わなくてすむようにロジック組みなおす。
まあ仕事でやってる人はそういうわけにもいかないんだろうけど
0126デフォルトの名無しさん2005/08/09(火) 22:29:02
いや、ほんとくだらねぇんですけど。

「引数」と「値を返す」
の基本的な二つの語句の意味がいまいち理解しきれません。
イメージとしては掴みかけているような感じはするんですけど。。。
0127デフォルトの名無しさん2005/08/09(火) 22:30:01
>>124
>もちろんラベル付breakをCに導入しろとは全然思っていない
俺はぜひ導入してほすぃと思うが。害はないだろ?
■ このスレッドは過去ログ倉庫に格納されています