[表示 : 全て 最新50 1-99 101- 201- 301- 401- 2chのread.cgiへ]
Update time : 05/09 23:17 / Filesize : 116 KB / Number-of Response : 449
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 17



1 名前:デフォルトの名無しさん mailto:age [2007/07/24(火) 23:17:11 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 16
pc11.2ch.net/test/read.cgi/tech/1184003625/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 93代目
pc11.2ch.net/test/read.cgi/tech/1184506311/

285 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:20:20 ]
なにしにって答え聞きに。

286 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:21:54 ]
殺伐中のところお邪魔しますよ

問題:指定したテキストを、タブをスペースに置き換えて別ファイルとしてコピーする

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
FILE *from, *to;
char ch;
int tab, count=0;

if(argc!=3) {
printf("<test> <コピー元> <コピー先>\n");
exit(1);
}

if( (from=fopen(argv[1], "r")) ==NULL) {
printf("コピー元ファイル %s が開けません。" , argv[1]);
exit(1);
}

if( (to=fopen(argv[2], "w")) ==NULL) {
printf("コピー先ファイル %s が開けません。" , argv[2]);
exit(1);
}


287 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:23:58 ]

while(!feof(from)) {
ch = fgetc(from);
if(ch=='\t') {
for(tab=count; tab<8; tab++)
fputc(' ' , to);
count=0;
}
else {
if(!feof(from)) fputc(ch, to);
count++;                 //※
if(count==8 || ch=='\n') count=0;  //※
}
}
fclose(from);
fclose(to);

return 0;
}

/* ここまで */

※の部分は何のために何の処理をしているんだろう

288 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:25:39 ]
>>285
学校(がっこう)の先生(せんせい)か、パパやママにきいてみよう!

289 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:26:54 ]
先生は教えてくれない。親は使えない

290 名前:286-287 mailto:sage [2007/08/01(水) 00:27:22 ]
見づらくなってしまった…すいません
あと、
tab<8

count==8
の8は何の数なんだろう

291 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:34:48 ]
>>290
実行して確認するとかしてみたのか?
「8」はタブ文字を8個のスペースにしてるだけだ。
for文の前後3行を読むだけでわかる。

292 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:36:33 ]
>>291
ということは別に8である必要はないのかな

293 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:38:31 ]
Windowsならデフォルトは8じゃないか?Linuxとかは知らん。
デフォルトって言葉が正しいかどうかは知らんが、メモ帳とかはそうだよな。
ってか、8が何かわからんかったら10にして実行してみろ。



294 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:47:45 ]
なるほど
サントス

295 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:55:01 ]
俺のはシカト?

296 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 01:08:45 ]
おーい

297 名前:デフォルトの名無しさん [2007/08/01(水) 01:46:27 ]
#include <stdio.h>
main()
{
static int a[][3] = {{001, 010, 100}, {002, 020, 200}, {003, 030, 300}};

int i, j;

for (i=0; i<3; i++) {
for (j=0; j<3; j++) {
printf("%d\t", a[i][j]);
}
putchar('\n');
}
}

このプログラムの実行結果が下のなんですがなぜそうなるかわかりません。
教えてください。

1 8 100
2 16 200
3 24 300


298 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 01:50:11 ]
頭に0がついてると八進数になるから

299 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 01:50:36 ]
0から始る場合8進数になるから


300 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 01:51:10 ]
>>297
>{{001, 010, 100}, {002, 020, 200}, {003, 030, 300}}
これは0で始まってるから8進法で書かれてる
んでprintfでの出力は10進法になってる

301 名前:デフォルトの名無しさん [2007/08/01(水) 01:51:16 ]
#include <stdio.h>
main()
{
static char input[] = "B1LSWIELTECH1\1\11W\1EE1ELLST?";
int i, c;

for (i=0; (c=input[i]) != '\0'; i++) {
switch(c) {
case 'B' : putchar('A'); continue;
case '1' : break;
case 1 : while ((c=input[++i]) != '\1' && c != '\0');
case 9 : putchar('T');
case 'E' : case 'L' : continue;
default : putchar(c); continue;
}
putchar(' ');
}
putchar('\n');
}

実行結果 A SWITCH T ST?
A SWITCHから先の動きがわかりません。わかる方教えてください。

302 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 01:53:39 ]
ってちょっと言い方がまずかったな
>{001, 010, 100}
たとえばこの部分の001と010が8進法で100は10進法ね

303 名前:デフォルトの名無しさん [2007/08/01(水) 01:54:26 ]
#include <stdio.h>
char input[] = "SSSWILTECH1\1\11W\1WALLMP1";

main()
{
int i, c;

for (i=2; (c=input[i]) != '\0'; i++) {
switch(c) {
case 'a' : putchar('i'); continue;
case '1' : break;
case 1 : while ((c=input[++i]) != '\1' && c != '\0');
case 9 : putchar('S');
case 'E' : case 'L' : continue;
default : putchar(c); continue;
}
putchar(' ');
}
putchar('\n');
}

実行結果 SWITCH SWAMP
同じ感じなんですが、SWITCHから先の動きがわかりません。お願いします。



304 名前:297 [2007/08/01(水) 02:00:39 ]
ありがとうございます
解決しました

305 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 02:01:36 ]
while ((c=input[++i]) != '\1' && c != '\0');
ここで条件が真の間、iが+1ずつされていく。
whileをぬけたらbreakが無いので次のputschar('T')が実行されて・・・
って感じだ。
デバッガあるならステップ実行してみればわかる。
なければwhileを弄れば多少わかる?
while ((c=input[++i]) != '\1' && c != '\0')puts("[while中]");

306 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 03:28:00 ]
自分で考えるための方法を教える必要があるような状況だな。

307 名前:デフォルトの名無しさん [2007/08/01(水) 11:32:27 ]
リンカする前の実行ファイルを起動すると一瞬で消えるんだが何故でしょうか?

308 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:45:28 ]
>>307
「リンカする」なんてことは通常できません。
リンクする前なら、それは実行ファイルになっていない筈です。
リンクされた実行ファイルについてなら、GUIを持たないプログラムを
GUIからダブルクリックで起動したら終了と同時に表示が消えるのは自明ですね。

309 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:50:37 ]
Ctrl-F5で解決する例のあれか

310 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 12:29:44 ]
昨日のお子様哀れすぎワロタ

311 名前:初心者 [2007/08/01(水) 15:14:36 ]
構造体の数値データからcsv形式のファイルを作りたいのですが、どうすればいいでしょうか。教えていただけるとありがたいです。

312 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 15:24:33 ]
構造体のメンバをcsv形式でファイルに書き込め

313 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 15:56:39 ]
C++なら簡単に出来るからC++スレで質問するといいよ^^



314 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 15:58:15 ]
まだ全然初歩のプログラムなのですが、わからないので教えてください。
プログラムファイル
入力データファイル
が用意されている。
問題
 文字データ中に含まれる文字の種類を調べるプログラムを作成しなさい。
[仕様]
・入力データ件数10件
  1件に最大100文字(半角とする)
  入力データは、文字型1次元配列(サイズ:101)に格納

・文字の種類は最大200種(文字型1次元配列使用)
 ただし、入力した文字中の改行(’¥n’)マークは処理対象外 とする

・文字コード順に並べ替えを行い出力する
・出力設計
 1行に最大25文字(文字区切りに1カラム空白)
 構成文字(並べ替え済み)を出力する

 X X X X X X X〜〜X X X X X X X

315 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 16:08:34 ]
>>314
自分がどこまでできてて、どこがわからないのか明確に
丸投げなら宿題スレに

C/C++の宿題を片付けます 94代目
pc11.2ch.net/test/read.cgi/tech/1185452895/

316 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 17:11:26 ]
プログラムは既に出来てるように思えた

317 名前:デフォルトの名無しさん [2007/08/01(水) 18:41:55 ]
>>314
です。入力データ、文字種を入力するところまではわかるのですが、どういう処理をすれば入力データに文字データが含まれているのか、また、そのデータを文字コード順に並べる処理がわからないです。アルゴリズムが浮かばなくて悩んでいます。お願いします。


318 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 18:47:33 ]
文字の種類が200種なんだから、int の配列[200]を用意して
文字種ごとに足していけばよかろう。
まあ文字種そのものは256個あるから[256]作ったほうが楽ではあるが。

319 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 19:18:22 ]
ちょっと今感動してる・・。
一ヶ月前の自分には解らなかった事が解るようになってる。
ニマニマしちゃうよ。

320 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 23:36:44 ]
>>318
回答ありがとうございます。文字種類の配列を用意するのは理解できました。もし
int i,n
char moji[100],shu[200]で入力しおえて
文字種ごとに足していくにはどのように書けばよいのでしょうかか?


321 名前:デフォルトの名無しさん [2007/08/02(木) 00:03:16 ]
>>320
char shu[256]={0}
としたうえで

for(i=0;i<100;i++) {
shu[moji[i]]++;
}


322 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 00:25:13 ]
>>321
素早い回答ありがとうございます。その文字種に含まれた文字はどのようにしたら文字コード順に並び替えられるのですか?

323 名前:デフォルトの名無しさん [2007/08/02(木) 00:28:42 ]
>>322
ちょっと根本的に分かってないみたいだけど
文字コードがインデックスになってるから

for(i < 256) {
for(j = 0 ; j < shu[i] ; j++){
putchar i
}
}

でおk



324 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 06:46:03 ]
分布数えソートだな。

325 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 08:05:01 ]
>>323
全然理解してなくて申し訳ないです。
回答ありがとうがざいました。これからプログラム書いてみようと思います。

326 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 09:39:43 ]
プログラムファイルは用意されてたんじゃなかったのかよw
sageは半角でな

327 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 09:45:47 ]
分布数えソート大好き

328 名前:デフォルトの名無しさん [2007/08/02(木) 09:59:24 ]
分布数えソートはもっと巧妙だけどな
アイディアは同じ

329 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 10:08:09 ]
Linux環境で半角の円マーク(\)打つのってどうやればいい?

330 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 10:08:49 ]
英字キーボードで、と言った方が良かったかも

331 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 10:17:11 ]
バックスラッシュと円マークの文字コードは
ASCII コードの範囲内でなら同一。
あとはフォントの問題。

どうしても混在させたいなら、ユニコードで何とかするしかない。
00A5 が円マークだ。
もちろん、エスケープ記号としては使えんがな。

332 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 13:38:15 ]
Linuxでの最長パス名なのですが、#defineされているものに
MAX_PATH とか MAXPATHLEN とかありますが
どれを#includeしてどの#defineを使うのが一般的なのでしょうか。
なんかいろいろあってわからなくなった。
教えて下さい。


333 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:08:43 ]
Linuxは知らないが、標準Cには<stdio.h>にFILENAME_MAXという定数がある。



334 名前:デフォルトの名無しさん [2007/08/03(金) 00:02:15 ]
int a[3][4];
int b[4];

と宣言した際に

a[0] = b;

がNGなんですか?

C言語の2次元配列は配列の配列と習ったんで
aのゼロ番目に大きさ4の配列を入れれると思ったんです。



335 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:07:29 ]
配列の配列と2次元配列は別物だよ

336 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:17:43 ]
というか、int a[3], b[3];だったとしても、
a = b; みたいな代入はできない。

337 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:21:15 ]
>>336みたいなのが何で出来ないんですか?って質問されたら
言語仕様です。としかいえないよな。
それでもなんで?って聞いてきたら教えるのをあきらめる。


338 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:30:31 ]
Cを作った人や、後にコンパイラを実装した人達が
できなくてよいという判断を下したから。

339 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:47:16 ]
配列の代入はできません。

340 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:01:38 ]
>>335
規格票では全く同一のものとなっていますが何か?

341 名前:デフォルトの名無しさん [2007/08/03(金) 01:08:11 ]
配列の配列
配列へのポインタ
ポインタの配列

などの細かなこと知らなくても問題ないよ


342 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:09:38 ]
いや、それは問題ある。

343 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:17:23 ]
構文上は配列の配列と思っておくと都合がいいけど、
Cでは配列の配列とは別に2次元配列が存在するわけでもないので、
少なくともCでは両者の言葉が区別されることなく使われている。

こう言えばいいか?



344 名前:デフォルトの名無しさん [2007/08/03(金) 01:21:08 ]
>>342
ないよ

そんな細かなこと知っててもなんの役にもたたん

345 名前:デフォルトの名無しさん [2007/08/03(金) 01:24:34 ]
int (*a)[10];

って大きさが10のintの配列へのポインタですよね

これの配列(大きさ20)はどう宣言すればいいのですか?

346 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:26:09 ]
そんなの自分で考えろよ

int (*a)[10][20];


死ねよ


347 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:28:43 ]
>>344
int n[10][10]; を int** に渡せないとか言う人の相手をしなきゃいけない身になってみろ。

348 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:33:51 ]
>>346
君が死んだほうがいいような・・・

349 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:42:50 ]
配列は 「変数名の直後に [サイズ] を書く」
ポインタは 「変数名の直前に * を書く」

括弧があろうがこれは変わらない。

それだけ覚えていれば何も迷うことは無い。

350 名前:デフォルトの名無しさん [2007/08/03(金) 02:28:56 ]
>>346
最初の一行、このスレのタイトルからしてお前が来なきゃ良いんじゃね?って
周りに思われていることに気づいた方が良いんじゃね?
自分が嫌うものをわざと見つけて、勝手にその対象物を叩いてイラついている
基地外にしか見えない・・・

351 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:40:09 ]
配列へのポインタの配列が必要になる状況って考え付かないんだけど、どんなの?

352 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:44:52 ]
double x y;
scanf("%f%f",&x,&y);

1.0 1.0
と取り込んだら
printf("x y = %f %f\n",x,y);

x y = 0.000000 0.000000
と出力された。
なんで???

353 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:46:04 ]
%lf



354 名前:352 mailto:sage [2007/08/03(金) 02:48:12 ]
わいわ…アホや…

355 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:04:33 ]
>>351
必要になるならないは問題ではない
どう書けるかときいているのです。

356 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:08:06 ]
そんなどうでもいいこと気にする前にもっと学ばなきゃいけないことがたくさんあると思うけど。

357 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:33:49 ]
わからないならわからないっていえよ
しったかぶってんなよw

358 名前:デフォルトの名無しさん [2007/08/03(金) 03:35:56 ]
教えられないくせに学べだの説教するやつは痛過ぎ・・・

359 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:36:37 ]
>>351
回転行列へのポインタの配列とか。

360 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:37:26 ]
あげくのはてには、必要ないだってw



361 名前:デフォルトの名無しさん [2007/08/03(金) 03:41:54 ]
int (*(*(*p[1])[2])[3])();

を3秒以内に理解できるかい?

362 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:43:06 ]
そこまですっきりしてると分かりやすい。

363 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:45:00 ]
int (*(*p)(int (*)(int (*)[20])))[10];



364 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:49:20 ]
それを有効に使ったコード書いてみてくれw

365 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 04:07:32 ]
ごめん、無理。

366 名前:デフォルトの名無しさん [2007/08/03(金) 05:42:26 ]
・C言語の欠陥
関数アドレスを返す関数において、その関数と同じ型の関数アドレスを
返す型の循環構造を定義できない。

typedef func_t (*func_t)(); // エラー
func_t f();

367 名前:デフォルトの名無しさん [2007/08/03(金) 05:58:18 ]
こういう場合は構造体を定義するしかない。
struct _s_t;
typedef struct _s_t (*func_t)();
typedef struct _s_t {
func_t f;
} s_t;

s_t f() {
s_t s = {f};
printf("f()");
return s;
}

main () {
// f()()()()()(); 本来期待する呼び出し形式
f().f().f().f().f().f();
}

結果:
f()f()f()f()f()f()

368 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 06:35:56 ]
それ聞いたことはあるけど、どういう場合に使うの?

369 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 07:34:06 ]
にわかプログラマーは心の狭いやつが多いねぇ
おまけにちょっと噛み付かれたらギャーギャー喚き散らさないと気がすまないらしい

370 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 08:12:21 ]
kmaebashi.com/programmer/pointer.html

371 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 08:39:05 ]
   / ̄ ̄\
 /   _ノ  \
 |   ( ●)(●)  < スレタイ読めないならどっか余所へ行けよ
. |     (__人__)____
  |     ` ⌒/ ─' 'ー\
.  |       /( ○)  (○)\
.  ヽ     /  ⌒(n_人__)⌒ \
   ヽ   |、    (  ヨ    | ← にわかプログラマー
   /    `ー─−  厂   /
   |   、 _   __,,/     \

372 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:57:59 ]
>>370
他の解説読んでたけどif文にセミコロンいらないの知らなかった…
でもコード見たらちゃんと書けてた

(´・ω・`)??
とりあえず気付けてよかった

373 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 12:51:25 ]
>>345
ヒント:a[20]と書くとaと[がとても強くくっつくので、「aは20個の要素を持つ配列です」ということになります。



374 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 14:58:37 ]
ポインタについて質問なのですが、軽くググった感じではポインタとは
ガーベッジコレクタを利用した変数という認識で良いのでしょうか

375 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:06:18 ]
全然違います。
アドレスを保持する変数です。

376 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:06:38 ]
>>374
びっくりするぐらいダメ


377 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:06:54 ]
>>374
ぜーーーんぜん違いますw

ポインタ = 変数や関数のアドレスを格納した変数。値はつねにアドレスになる。


378 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:07:54 ]
なにこの同時ダメだしw ワロタ

379 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:08:42 ]
wwwwwwwwwwwwwwwwwwwwwwww

380 名前:374 mailto:sage [2007/08/03(金) 15:10:06 ]
私も吹きました。修行不足のようですね。出直してきます

381 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:45:39 ]
そもそもCにガベコレなんて無いし

382 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 16:50:41 ]
軽くググってガベージクレクタにたどり着いた道程に興味があります。

383 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 17:10:33 ]
童貞に興味があります



384 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 17:10:51 ]
>>383
いりますか?

385 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 17:10:59 ]
俺は無い






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<116KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef