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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/09(木) 00:31:01
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 3
http://pc8.2ch.net/test/read.cgi/tech/1160682950/

過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/


関連スレ
くだすれC言語(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1153542424/

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/
0310デフォルトの名無しさん2006/11/15(水) 14:46:54
CRLFの問題もあるけどね
03112982006/11/15(水) 14:48:15
>>309
すいません、それすら知りませんでした。
>>308
>>298は課題が出たからわからないので聞きにきたんですが、
問題の内容にすら書いていません。今までの課題の流れだと日本語を入力したことがないので
流れから判断して多バイト文字は無視でお願いします。
0312デフォルトの名無しさん2006/11/15(水) 14:52:55
>>300
しかし汚いコードでつね
0313デフォルトの名無しさん2006/11/15(水) 15:38:39
宿題スレでやれ
0314デフォルトの名無しさん2006/11/15(水) 15:44:12
char str[6];
int i,k=6;

for (i=0;i<6;i++)
{
str[i]="文字列"[k--];
}
printf("%s\n",str);
return 0;


はいはい俺天才
0315デフォルトの名無しさん2006/11/15(水) 15:45:40
>>314
つ\0
0316デフォルトの名無しさん2006/11/15(水) 15:48:26
str[5] = '\0';

え、、えへへ
0317デフォルトの名無しさん2006/11/15(水) 15:51:31
>>314
いや、大きさが足りない
(男の人に言ったらまずかった?)
0318デフォルトの名無しさん2006/11/15(水) 15:52:08
釣りは釣りスレでやれ。
0319デフォルトの名無しさん2006/11/15(水) 15:53:24
k-- → --k
0320デフォルトの名無しさん2006/11/15(水) 15:55:52
str[6] → str[7]
0321デフォルトの名無しさん2006/11/15(水) 16:30:37
勉強になりました
0322大学生2006/11/15(水) 22:26:24
「問題16」eの値を実数として計算し表示せよ。
「問題17」πの値を実数として計算し表示せよ。

「問題18」eの値を小数点以下60桁まで求めよ。
「問題19」πの値を小数点以下60桁まで求めよ。
この問題16.17.18、19のC言語プログラム(C++)でお願いします。
それと多倍長少数を利用して作ってください。
0323デフォルトの名無しさん2006/11/15(水) 22:28:34
>>322
C/C++の宿題を片付けます 76代目
http://pc8.2ch.net/test/read.cgi/tech/1162771475/
0324デフォルトの名無しさん2006/11/15(水) 23:49:40
C言語の入門サイトを見て回ってVC++ 2005 ExpressEditionをインストールしたのですが
いろんなところでとりあえずこれでやってみれと書いてある
Win32コンソールアプリケーションで作ると追加できるソースファイルが*.cppです
とりあえずHelloWorld!は出たんですが
*.cファイルが追加できるように設定しといた方がいいんでしょうか?
0325デフォルトの名無しさん2006/11/15(水) 23:57:59
別に cpp でいいんじゃない?
0326デフォルトの名無しさん2006/11/16(木) 00:15:23
ファイル名を指定する時に拡張子付きで入力しろ。
03273272006/11/16(木) 03:22:17
テキストファイルを読み込んで特定の箇所を上書きしたんですが、
その書き換えかたがわかりません。教えていただけませんでしょうか><;
以下のように記述していまして、c(文字型)の部分に整数を入れたいんです。

   while((c = fgetc(fp)) != EOF)
   {
      if(c == '特定の文字')
      {
         //ここがわかりません
      }
   }
0328デフォルトの名無しさん2006/11/16(木) 03:36:04
>>327
f = ftell();
fseek(fp, 0, SEEK_CUR);
fputc(c, fp);

つまり"r+"で開いたファイルは、fseek()すればそのすぐ次には書いてもよい。
一度でも書いたらまたfseek()もしくはrewind()しないと読めない。
0329デフォルトの名無しさん2006/11/16(木) 03:37:18
while((c = fgetc(fp)) != EOF)
{
if(c == '特定の文字')
{
c = 15; //任意の整数
}
}
0330デフォルトの名無しさん2006/11/16(木) 03:38:59
おっとっとftell()は不要でした
0331デフォルトの名無しさん2006/11/16(木) 03:45:48
>>328
おまえ日本語読めないのか?
>>327はそんなこと望んでないぞ。
>>329が正解だろ。
0332デフォルトの名無しさん2006/11/16(木) 03:54:54
”上書きしたんですが”を”上書きしたいんですが”とエスパー読みしてみた
03333272006/11/16(木) 05:13:55
>>328さん
>>329さん
>>331さん

ありがとうございました。助かります。
すいません打ち間違ってしまったようで、
332の方のエスパー読みが実はこちらの言いたかったことなんです。
とすると、328の方のおっしゃったfseekを使えばいいんですか?
とりあえず使い方を調べて試してみます。
03343272006/11/16(木) 05:30:56
続けて失礼します。
試しに大文字と小文字を置き換えてみようと思って下のように
記述したのですが、これだと実行時にエラーになってしました。
恐らくfseekの使い方が誤っていると思うのですが、
どのように改善すればいいんですか? 質問ばかりで申し訳ないです。

  while((c = fgetc(fp)) != EOF)
  {
    if(c=='S')
    {
      fseek(fp,0,SEEK_CUR) ;
      fprintf(fp, "s") ;
      fseek(fp,0,SEEK_CUR) ;
    }
  }
0335デフォルトの名無しさん2006/11/16(木) 05:37:35
>>334
多分ファイルのオープンモードが"r"になってるんだと思うよ。
"r+"にしてね。
03363272006/11/16(木) 05:43:09
>>335さん

ありがとうございます。
モードは大丈夫みたいです。
他の文法や使い方は問題ないですか??
0337デフォルトの名無しさん2006/11/16(木) 05:43:43
あ、それともう一つ
fgetc(fp)で既にファイルポインタが一つ進んでいるので

fseek(fp, -1, SEEK_CUR);
fputc('s', fp);
fseek(fp, 0, SEEK_CUR);

だな
0338デフォルトの名無しさん2006/11/16(木) 05:45:44
それからcはintで宣言してる?charじゃだめだよ
EOFを表せないから
0339デフォルトの名無しさん2006/11/16(木) 05:47:49
眠気に耐えられないので寝まつ
後は他の人に任せた
03403272006/11/16(木) 05:53:27
>>335さん

ありがとうございます。
確認したんですがモードは大丈夫なようです。
前後は以下のようになってますが、
関数の使い方や文法に間違いはありませんか??
もしかすると最初に見つけたSで
処理を繰り返してしまっているかもしれません。


  fp = fopen("MMMMM.txt", "r+") ;

while((c = fgetc(fp)) != EOF)
{
if(c=='S')
{
fseek(fp,0,SEEK_CUR) ;
fprintf(fp, "s") ;
fseek(fp,0,SEEK_CUR) ;
}
}

fclose(fp) ;
03413272006/11/16(木) 06:00:43
>>339さん

ありがとうございました。
337を参考に変えてみたんですが、それでも変わりませんでした・・・。
改行したくないのでfprintfを使ってるのが問題なのかもしれません。

cは整数以外も読み込むのでcharでないとエラーになってしまうと
思います・・・。

遅くまでありがとうございました。頑張ってみます。
0342デフォルトの名無しさん2006/11/16(木) 09:09:46
>>341
fgetc()の戻り値はcharで表せないEOFも返す必要から、intになっている。
従って、cはintであることが望ましい。
#つーか、charで受けるのは間違い。

それと、最初のfseek()は1バイト戻せと既に指摘されているのだがそっちは無視か?
0343デフォルトの名無しさん2006/11/16(木) 13:18:35
>>342が無視された件・・・
0344デフォルトの名無しさん2006/11/16(木) 13:32:42
無知な奴ほど素直じゃないのさ
03453272006/11/16(木) 13:49:39
>>342さん

ありがとうございます。

fseekの-1は参考にさせてもらいました。
書き込みのタイミングがかぶってしまったようです。

おっしゃるとおりcharが落とし穴だったようで、
intにしたらうまくできました!
文字はcharというド素人の固定概念が間違ってました・・・><;

これを多少応用したものを作らなければならないので、
まだ安心はできませんが、なんとかなりそうです。
助かりました。ありがとうございましたm(__)m
0346デフォルトの名無しさん2006/11/16(木) 14:25:08
サーバに単純な数値だけのデータを送りたいのですが
どのようにすればよいのでしょうか?
windowsのマシンでCを使い
linuxのサーバにデータを送るという感じです
0347デフォルトの名無しさん2006/11/16(木) 14:35:59
>>346
サーバとクライアント用の二つのプログラムを用意する
(来週につづく...)
0348デフォルトの名無しさん2006/11/16(木) 14:38:13
>>346
そのサーバって何?http? ftp? samba?
そのプロトコルに従って通信してください。
03493462006/11/16(木) 14:38:53
ちなみにサーバ用はPHPを使うのですが出来ますか?
0350デフォルトの名無しさん2006/11/16(木) 14:45:09
メールで送ったらいいんじゃね?
0351デフォルトの名無しさん2006/11/16(木) 14:49:21
>>349
PHPってことはHTTPだろ。Winsockでも使ってやれ。
03523462006/11/16(木) 14:54:09
>>351
そうですねhttpです
クライアント用のほうは事情があって
Cで書かなきゃならないので・・・
Winesockですか調べてみます
これはCの中でできるんですよね?
0353デフォルトの名無しさん2006/11/16(木) 14:57:33
>>352
VC++, gcc, bccなどWin32APIが呼べる環境ならできる。
これ以上の話はCとは関係ないのでスレ違い。
0354デフォルトの名無しさん2006/11/16(木) 16:22:03
inetd使えば?
0355デフォルトの名無しさん2006/11/16(木) 18:33:09
おまいらに全てを捧げたくなる位惚れちゃってます。
0356デフォルトの名無しさん2006/11/16(木) 19:14:08
>>355
おまえのものはおれのもの
0357デフォルトの名無しさん2006/11/16(木) 20:04:59
>>356
よお、じゃいあん
0358デフォルトの名無しさん2006/11/16(木) 20:51:49
>>357
悪いけど、今日は歌いたい気分じゃない・・・
0359デフォルトの名無しさん2006/11/16(木) 21:17:08
fgets + sscanf でなく、scanf を使ってしまっても
構わないようなケースにはどのようなのがあるでしょうか。
0360デフォルトの名無しさん2006/11/16(木) 21:22:40
ちょっと実験するためだけのような使い捨てのコードなら。
0361わからないので教えてください2006/11/16(木) 21:46:32
すみません、この問題のプログラムはどう作ればよいのかがわからないので
ぜひ、よろしくお願いします・・・

問題
配列su(要素数:12)に任意の数値をランダムに初期値設定し、逐次決定法によって
整列(昇順)させ、結果を表示させるプログラムを作成してください。
0362デフォルトの名無しさん2006/11/16(木) 21:54:26
何とか法とか何とか論を皆が知ってると思うなよ
0363デフォルトの名無しさん2006/11/16(木) 22:03:07
どうみても宿題ですありが(r
0364デフォルトの名無しさん2006/11/16(木) 22:05:56
逐次決定法って何だよ。バブルソートか?単純選択法か?
0365デフォルトの名無しさん2006/11/16(木) 23:08:41
任意の数値をランダムに初期値設定って何?ランダム値を初期値にするってこと?
逐次決定法が何か知らんが昇順ソートでおk?
0366デフォルトの名無しさん2006/11/16(木) 23:19:29
C++やP2P技術に卓越したプログラマの方々
宜しければ一度で良いので拝見して頂きたいです
当企画の成立には貴方の力が必要です

次世代コミュニティ製作 C++,mod_perl,P2Pが使えるコーダ、グラフィッカ募集中
http://pc8.2ch.net/test/read.cgi/tech/1163349367/
0367デフォルトの名無しさん2006/11/16(木) 23:20:33
>>366
おいいい加減にしろよ。あちこちのスレにコピペしやがって。
削除依頼出すぞ
0368STUDENT2006/11/16(木) 23:29:36
「問題17」πの値を実数として計算し表示せよ。
「問題19」πの値を小数点以下60桁まで求めよ。
のCプログラム(C++)を作ってください。
多倍長少数を利用してプログラムを作ってください。

0369デフォルトの名無しさん2006/11/16(木) 23:44:45
>>368
おいいい加減にしろよ。あちこちのスレにコピペしやがって。
削除依頼出すぞ
0370デフォルトの名無しさん2006/11/17(金) 00:06:05
>>368
作るのはかまわんが、お前にはやらん。
0371デフォルトの名無しさん2006/11/17(金) 00:12:11
Delete(368);
0372デフォルトの名無しさん2006/11/17(金) 16:26:48
>>368
printf("3.141592653589793238462643383279502884197169399375105820974944");
0373デフォルトの名無しさん2006/11/17(金) 18:18:03
int Test(int iParamCount,...)
{
char* pParam[20];
int i;
va_list args;

//可変個引数を取得
va_start(args, iParamCount);
for(i=0; i<20; i++){
pParam[i] = va_arg( args, char* );
}

return 0;
}

上記のように可変個引数を取得しようとしているのですが、
引数の型が複数あり、うまく引数が取得できません。
なにかいい方法ありませんか?
0374デフォルトの名無しさん2006/11/17(金) 18:19:49
sageちゃった。
0375デフォルトの名無しさん2006/11/17(金) 18:30:07
printf/scanf系みたいに呼び出し側から型を伝えるようにするしかない。
蛇足だが、vprintf/vscanfのようにva_listを引数にとるものも作れ。
0376デフォルトの名無しさん2006/11/17(金) 19:30:12
#include<stdio.h>

int main(void)
{
int array[5];
int count;


for(count=0;count<5;count=count+1){
printf("Input No.%d",count);
scanf("%d",array[count]);
}

for(count=4;count>=0;count=count-1)
printf("No.%d:%d\n",count,array[count]);

return(0);
こいつで実行してもエラーで強制終了するんですけど何故ですか?}
0377デフォルトの名無しさん2006/11/17(金) 19:33:07
>>376
scanf("%d",array[count]);
引数はアドレスです
scanf("%d",&array[count]);
0378デフォルトの名無しさん2006/11/17(金) 19:33:17
>>376
}がなくね?
0379デフォルトの名無しさん2006/11/17(金) 19:36:46
>>378
>こいつで実行してもエラーで強制終了するんですけど何故ですか?}

この文の最後にあるw
0380デフォルトの名無しさん2006/11/17(金) 19:37:39
>>379
見えてなかったorz
0381デフォルトの名無しさん2006/11/17(金) 19:47:13
>>377
それでできましたどうもです
0382デフォルトの名無しさん2006/11/17(金) 20:21:41
>>379
ちょっとワロタ
0383デフォルトの名無しさん2006/11/17(金) 22:30:56
LPCSTR str = "Friday, 01-Jan-2007 00:00:00 GMT";のような
クッキー形式の日付をtime_t値に変換する関数とかあれば教えて下さい。
03843832006/11/17(金) 22:39:41
無さそうなんでやっぱりいいです。
0385デフォルトの名無しさん2006/11/17(金) 23:31:22
>>383
自分で変換する関数作れ
0386デフォルトの名無しさん2006/11/18(土) 00:21:01
>>383
つ[popen("date -d 'Friday, 01-Jan-2007 00:00:00 GMT'", "r")]
0387デフォルトの名無しさん2006/11/18(土) 00:23:10
あ、いかん、出力形式指定するの忘れてた。
date -d 'Friday, 01-Jan-2007 00:00:00 GMT' +%s
0388デフォルトの名無しさん2006/11/18(土) 01:23:06
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int s, x[8]={0};
s=sizeof(x)/sizeof(x[0]);
printf("size of x: %u¥n"(unsigned) s);
return 0;
}
void fun(int *x)
{
int s;
s=sizeof(x)/sizeof(x[0]);
printf("size of x: %u¥n"(unsigned) s);
}

fun関数の中で配列xの要素数をカウントするプログラムを考えているんですが、
関数に配列を渡す時点でポインタに置き換えられるので、main関数での
printf文とfun関数でのprintfの出力が違ってしまいます。

2つが違ってしまう原理自体は理解出来ているつもりなのですが、何かいい方法は
ないでしょうか?スマートな方法を思いつかなくて困っています。
0389デフォルトの名無しさん2006/11/18(土) 01:27:39
>>388
C++なら
template <int N>
void fun(int (&x)[N})

と宣言すれば

s=sizeof(x)/sizeof(x[0]);

が使えるが、Cでは配列は必ずポインタに変換されてしまうため
配列の大きさに関する情報は失われてしまう。

通常
void fun(int *x, int n)
と、別のパラメータで大きさを渡す。
03903882006/11/18(土) 01:33:36
>>389
深夜にありがとうございます。

やっぱりパラメータで渡すしかありませんか。引数が増えていくとどんどん
コードが不細工になってくるんで、もう泣きそうで……

ってかC++だったらそんなこと出来るんだ。この際、C++のお勉強しようかな。
0391デフォルトの名無しさん2006/11/18(土) 01:36:21
>>390
設計を変えて構造体を使えば?
もしくは番兵を使う手もある。(最後の要素を示す記号として-1を使うとか)
03923882006/11/18(土) 01:40:46
構造体はよく理解出来てないんで、ちょっとやってみます。
複素数演算を作ったことがあるんで、上手くやればいけるかも知れませんね。

簡単化のためにintで書いたんですが、実際はdouble型でインパルス応答なんかの
数値を入れようと思っています。なので、番兵に数値が入るとまずくって…

構造体でポインタと要素数を抱き合わせておくっていうのが、よさそうですね。
0393デフォルトの名無しさん2006/11/18(土) 02:01:19
大抵の処理系なら、NaNを番兵に使えるかもしれない。
或いは、正規化できる前提で-0を使うとか。
0394デフォルトの名無しさん2006/11/18(土) 03:11:01
ダイテル本の練習問題の条件演算子を使った問題で

printf("%s\n", count % 2 ? "****" : "++++++++");
てやつがあったんですがこれは
count % 2 で1の時に真を返すってことでいいんですか?
0395デフォルトの名無しさん2006/11/18(土) 03:38:23
お前は何をいっているんだ。
0396デフォルトの名無しさん2006/11/18(土) 03:55:35
たぶん、「0じゃない値を真と評価する」を
俺用語に訳すと「count%2で云々」になるんだと思う。

あと、ゆとり世代で日本語が苦手なので
本の名前なんか正確に書かなくても、読み手は推測してくれるし
文章に読点なんか無くても、読み手が理解するよう努力してくれるものだと思ってる
はず。
0397デフォルトの名無しさん2006/11/18(土) 04:04:30
>>396
わかりました、ありがとう!
もう消えていいよ!
0398デフォルトの名無しさん2006/11/18(土) 05:59:24
>>397
人の忠告は素直に聞くようにしたほうがいいよ。
自分にとって不愉快な書き方だからってそんな反応をしているようじゃ、
次に書き込むときも似たようなことをして、似たような反応をされるはず。
0399デフォルトの名無しさん2006/11/18(土) 07:55:53
この場合どっちもどっちだと思うけど
0400デフォルトの名無しさん2006/11/18(土) 10:40:12
少し注意されただけで煽り返すとか精神年齢低すぎだろ
下手にでる事も出来ない奴って・・・出世できねーぞwwwww
0401デフォルトの名無しさん2006/11/18(土) 10:54:29
>>400
木津着いた・・・
0402デフォルトの名無しさん2006/11/18(土) 11:42:04
実年齢が低かったら精神年齢も低くても問題ないよ
0403デフォルトの名無しさん2006/11/18(土) 12:42:39
私の書いたBubble Sortのプログラムこれであっていますか?
コンパイルして正常に動作する感じですが、提出物なので皆さんもレビューしてくださいませんか?

#include <stdio.h>
main()
{
char moji[50],wk;
int i,owari;
printf("文字列を入力してください。隣接交換法で昇順にソートします\n");
scanf("%s",moji);
/* printf("%s\n",moji); */
/* 入力された文字列の終わりを求める */
for ( owari = 0 ; moji[owari] ; owari++)
; /* owariの中身が要素数になる */
/*printf("%d\n",owari); */
for ( ; owari >= 2 ; owari-- ){
for ( i = 0 ; i+1 < owari ; i++ ){
if ( moji[i] > moji[i+1] ){
wk = moji[i];
moji[i] = moji[i+1];
moji[i+1] = wk;
}
printf("%s\n",moji);
}
}
printf("ソート後の文字列は %s です。\n",moji);
}
0404デフォルトの名無しさん2006/11/18(土) 12:55:15
>>403 「正常に動作」の定義は?
0405デフォルトの名無しさん2006/11/18(土) 13:07:43
初心者です。
関数で「*strcpy」とかについている「*」の意味ってなんですか?
ポインタ?
0406デフォルトの名無しさん2006/11/18(土) 13:10:35
>>405
ポインタ。
0407デフォルトの名無しさん2006/11/18(土) 13:13:28
>>403
{を行末に付けるの止めれ。ブロックが見にくい
scanfに&が無い
scanfだと50文字以上入力されてもわからない
for (; owari >= 2 ; owari-- ) → for (; owari >1 ; owari-- )
逐次ソート結果出力はイラネ。
0408デフォルトの名無しさん2006/11/18(土) 13:15:08
[ ]は自由の牢獄
* は希望の光
両者は同じであり、異なる。
0409デフォルトの名無しさん2006/11/18(土) 13:17:28
>>407 本当にお疲れ様でした。
>{を行末に付けるの止めれ。ブロックが見にくい
フリーフォーマット(感想はチラシの裏に)
>scanfに&が無い
配列なのに必要?
>逐次ソート結果出力はイラネ。
「正常に動作」の定義は?
■ このスレッドは過去ログ倉庫に格納されています