[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 01/17 15:29 / Filesize : 215 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

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



1 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 20:41:54 ]
C言語の*入門者*向け解説スレッドです。
初心者、初級者の方は他の質問スレのほうが良いかもしれません。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 130代目
pc12.2ch.net/test/read.cgi/tech/1250204272/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

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

過去スレ
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

601 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:03:53 ]
話がずれてるな。
処理したくない場合、どう書くかについての話だろ?
>>593はななめってる

602 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:05:42 ]
>>594だけ見るとそう思っているかのように見えるけど>>595で理解してるようだしな
>>597は3項演算子に特別な思い入れでもあるのかねぇw

603 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:07:03 ]
こんなマヌケな書き込みしといて、まだバレてないとか、ごまかせるとか思ってるのか。



604 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:09:32 ]
>>601
いやぜんぜんななめじゃないよ。
条件演算子を効率のためにつかってるって思ってるやつに、
そうじゃないって例を示しただけ。

605 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:10:24 ]
>>591-603
誰にレスしてるかくらいはっきりさせろ蛆虫共

606 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:11:23 ]
>>604
>>593の下の方がいい理由を言ってみろ

607 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:13:06 ]
こんな簡単な例じゃどっともかわらねぇよ

608 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:13:08 ]
>>586
使えない。値を返す必要があるから空文があったら困るだろ。
どうしてもってことなら適当な変数でx=xとか入れときゃいいんじゃね?

609 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:17:04 ]
>>586
> (aaa == bbb) ? flag = true : ; ;
つーか、式を返す形で使わなきゃダメだろ。色々と。



610 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:19:33 ]
>>606
みて分かれよ。
プログラミングの基礎って本に載ってるぞ。
サイエンス社2300円。

611 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:22:37 ]
高い

612 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:25:00 ]
>>604
> 条件演算子を効率のためにつかってるって思ってるやつに、
> そうじゃないって例を示した
だから、ななめじゃん

613 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:26:04 ]
三項演算子は値を返すから

変数 = 条件?成功:失敗;
return 条件?成功:失敗;

みたいな形でよく使われる。
良く使われるということは、そう書くとみんな理解しやすい。
コンパイラ的に見ると

if ( 条件 ) 変数=成功 else 変数=失敗;

と吐き出されるコードは多分一緒。
逆に言えば、値を返す必要のないときに
三項演算子を使うのは理解しにくい?

614 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:27:15 ]
C++だと初期化でたまに使いたくなる

615 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:30:50 ]
>>612
「ななめじゃん」って一言レスしてれば、ななめだってことにできると思ってるのか。

616 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:31:49 ]
いまだに三項演算子なんて言う人がいるとは

617 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:33:46 ]
if ( 条件 ) 変数=成功 else 変数=失敗;
より
( 条件 ) ? 変数=成功 : 変数=失敗;
の方がコード量減るからいいじゃん。
プロはこの辺の効率も求めていかなければならない。

618 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:34:57 ]
七行スレから来ました

619 名前:デフォルトの名無しさん [2009/10/20(火) 23:48:36 ]
ご教授お願い致します。

以下のような文字列から数字部分(10桁)の「1111111112」だけを抜き出したいと思います。
但し以下のような条件があります。
・数字の前は必ず「AAA」があります。
・下記はカンマ区切りだけど、カンマ区切りとは限りません
-------------------------------------
あいうえお,AAA1111111112,かきこけこ
-------------------------------------

strstr関数など、いろいろ試してみたのですがどうもうまくいきません。
皆様、よろしくお願い致します。

こんなのもわからなくて恥ずかしいです。。。。



620 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:49:49 ]
宿題は宿題スレへ

621 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:49:57 ]
>>617
> ( 条件 ) ? 変数=成功 : 変数=失敗;
変数 = ( 条件 ) ? 成功 : 失敗;
普通こうでしょ…?


622 名前:デフォルトの名無しさん [2009/10/20(火) 23:50:49 ]
>>619
頑張れ

623 名前:デフォルトの名無しさん [2009/10/20(火) 23:55:02 ]
了解。宿題すれにいきマイケル。

624 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 00:07:20 ]
>>621
同じ変数だとはどこにも…

625 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 00:10:42 ]
>>624
代入するのは成功か失敗かなのに?
あとから二ヶ所でチェックするんですか?(笑)


てか"文"を書くなと。


626 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 00:10:50 ]
>>624
>>587

627 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 00:11:39 ]
>>619
sscanfについてもう少し調べる

628 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 01:00:46 ]
>>586
aaa == bbb && flag = true;


629 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 01:03:33 ]
if ( aaa == bbb || (flag = false,0) ) flag = true;




630 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 01:12:10 ]
アホだw

631 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 01:21:36 ]
>>628
括弧が不足してる

632 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 02:22:07 ]
>>629
なぜfalseにしたし

633 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 03:09:30 ]
ちょっとした質問なんですが
scanf関数で数字を入力する際に
数字を打ち込みエンターキーを押すと改行してしまいます
もう一度数字を入力すると、前に打ち込んだ数字が認識されます
二度目の数字を入力しないと、ずっと改行しつづけます

この仕様はどうにかならないんでしょうか

634 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 03:12:02 ]
scanf()の使い方を間違ってる

635 名前:633 mailto:sage [2009/10/21(水) 03:14:31 ]
>>634
えっ

636 名前:633 mailto:sage [2009/10/21(水) 03:17:40 ]
今見たら、>>634さんの言うとおり
scanf()の中に\nを混ぜてしまっていました

お粗末な質問に答えていただき有難うございました

637 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 07:09:37 ]
うむ

638 名前:634 mailto:sage [2009/10/21(水) 07:49:24 ]
お前が言うなw

639 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 09:59:16 ]
よきにはからえ



640 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 10:05:31 ]
条件演算子を三項演算子と呼んで疑問を感じないようではいけないな。
単項、二項、三項は項の数を問題にしているのであって条件式であることは無関係でしょ?

641 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 10:15:03 ]
ふーん

642 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 12:34:34 ]
どっちでもいいや

643 名前:デフォルトの名無しさん [2009/10/21(水) 14:39:25 ]
Aのプログラムから数秒後にBのプログラムに切り替えたいです。
そういった時にはtime関数で現在時刻を取得してからでないとだめなんですか?
プログラムの組み方がよくわからないので教えてください


644 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 14:50:06 ]
>>643
標準関数だけでは無理があるので、環境依存スレでどうぞ。

645 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 14:50:50 ]
現在時刻は要らないだろ。
開始からの経過時間さえ判ればよい。
だから普通は clock() を使う。

646 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 14:54:39 ]
>>644


647 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 15:02:19 ]
>>646
time()だけでやるのは待ちループが必要になって現実的でないということは理解している?

>>645
あんたも同類か。ついでに言えば、clock()だからと言ってtime()と手間がさして変わるわけではないが。

648 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 15:03:00 ]
sleepしてexecすればいいのでは

649 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 15:27:53 ]
それは標準ではないだろ。



650 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 16:05:25 ]
とはいえ、POSIXに準拠しとけば初心者が使う大抵の環境で動くんじゃなかろうか。

651 名前:デフォルトの名無しさん [2009/10/21(水) 16:21:56 ]
ポインタ変数の勉強しています。初心者です。
int i;
int *ip = &i;
2行目のコードの記述がおかしいです。
ipはアドレスを保持するポインタ変数で、*ipはポインタが指し示す領域の内容ですよね?
*ipには3とか-1といった整数値が入るものだと思っていましたが上の例ではアドレスを代入しています。
アドレスも整数に分類される値ということでしょうか。
これでもコンパイルが通るので何が何だかさっぱりです…

652 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 16:26:46 ]
int *ip は、 int* ip と思えばわかりやすいかな。
int* という型なのだ。でも int* p1, p2とかやるとはまるから注意な。

653 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 16:29:35 ]
宣言時の代入は、初期化の利便性のために少し特殊になっている。
コンパイルの結果は変わらないから、気に入らなければ宣言時代入は使わなくてもいい。

654 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 16:30:49 ]
>>652
ほざけ。

655 名前:デフォルトの名無しさん [2009/10/21(水) 16:35:17 ]
分かったようで分からないようではっきりしませんが、つまり
int *ip = &i;
は置き換えると
int *ip
ip = &i;
ですか。

656 名前:デフォルトの名無しさん [2009/10/21(水) 16:36:36 ]
もしかしたらスレ違いかもしれませんが質問させてください。
 
C言語を始めたばかりの初心者です。
LSI C-86 Ver3.30c 試食版というものを使っています。
コンパイルをして、コードをコマンドプロンプトで表示させると、
日本語が文字化けしてしまいます。
コンパイルもできているし、アルファベットや数字はきちんと出るのですが……。
どうすれば日本語が表示できるようになるのでしょうか?
ぐぐってもよく判らなかったため、質問させていただきました。
どうかよろしくお願いします。

657 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 16:37:32 ]
>>656
悪いことは言わないから、そのコンパイラは捨てなさい。
それはもう、10年以上も前のパソコン通信時代の代物だ。

658 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 16:43:00 ]
>>655
です。

659 名前:デフォルトの名無しさん [2009/10/21(水) 16:48:58 ]
>>658
ありがとう。あやうく誤解するところでした。。



660 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 16:50:22 ]
>>656
文字コード体系が違う。
以前の Windows では CP-932 が使われていたが、
最近は UTF-16LE に変わってきている。
古いソフトなどを使うと、それらが混在するので文字化けすることがある。

ソースコードと表示系の文字コードを同じものに揃えれば問題ない。


661 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 16:57:50 ]
個人的には Turbo-C 2.01 がオススメ。
軽量・高速で使いやすく、変な制限もない。


662 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 17:01:08 ]
>>657
>10年以上も前のパソコン通信時代
20年前ですw

663 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 17:04:55 ]
16ビットのコンパイラはおすすめ出来ません。
32ビットよりも難しいです。

664 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 17:16:27 ]
selectでSleepの代わりに出来ない?

665 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 17:30:56 ]
>>664
できなくはありませんが、厳密には違う動作です。POSIXならusleep()という選択肢もありますが。

666 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 17:41:34 ]
UTF16でもコンパイラ通るの?
エラー出るだろ?

667 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 17:42:13 ]
そりゃ環境による

668 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 20:10:15 ]
文字列をセットする関数を作りたいのですが、どうすればいいですか?
下のソースは間違ってますが、
やりたいことは、値によって、aaa、bbbを出力したいのです。
コンパイラに依存しない?標準のC言語の範囲でお願いします。

void hoge(){
char s[256];
setText(0,s);
printf("%s\n",s); // aaa を出力したい
settext(1,s);
printf("%s\n",s); // bbb を出力したい
}
void setText(int n , char *str){
if (n == 0) {
strcpy(str,"aaa");
}else{
strcpy(str,"bbb");
}
}

669 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 20:13:39 ]
それで良いじゃん。



670 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 20:14:37 ]
>>668
setTextがsettextになってる以外は別に間違ってないぞ

先頭に
#include <stdio.h>
void hoge();
void setText(int n , char *str);
int main(){ hoge(); return 0; }
を付ければ問題なく動く

671 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 20:32:14 ]
>>669-670
これでよかったんですね。
どうもありがとう。

672 名前:656 [2009/10/21(水) 22:15:16 ]
みなさま本当にありがとうございます……。
コンパイラが古いのですね。
Turbo-C 2.01というものをダウンロードしてみることにします。
本当にありがとうございました。

673 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 22:31:22 ]
せっかくMicrosoftがVisualStudioを無料で配布してるのに、なんで初心者は使わないんだ?
BCCとかLSI-Cよりよっぽど使いやすいのに。
どうしてもコマンドラインがいいっていうんならLinux入れてgcc使うべき。

674 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 22:33:58 ]
mingwでいいよ.古いけど

675 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 23:55:53 ]
Cマシンとかいう奴を使え。

676 名前:デフォルトの名無しさん [2009/10/22(木) 00:02:31 ]
つーマシン作れよ

677 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 00:03:34 ]
VisualStudioはごちゃごちゃしてるからだよ
分厚い、単なる取扱説明書みたいなものが本屋に溢れてる

678 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 00:12:01 ]
VCはC++標準への準拠度は低いし
Cライブラリがグローバル名前空間を汚染してるし
勉強には向いてないよ。

679 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 00:12:33 ]
つーか、学習段階なら日本語周りは後回しにしたほうが良いんじゃね。
とりあえず ASCII 文字だけで一通りやってみたら?




680 名前:デフォルトの名無しさん [2009/10/22(木) 00:14:55 ]
C言語の学習にはBCC+cpadが理想的

681 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 00:19:08 ]
お手軽ではあるが、理想的ではない

682 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 01:15:22 ]
関数の引数に構造体を渡す場合に値を書き換えない場合は値渡しにするのが一般的ですか。ポインタ渡しの方がデータのコピー量が少ないのでどっちがいいのか悩みます。

683 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 01:22:26 ]
ポインタ渡ししましょう。

684 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 01:34:44 ]
好きな方にすれば良いよ。

685 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 01:43:45 ]
>682
foo_t foo(const struct foo *foo);
最後のfooは、foo()の名前(シンボルへのポインタ)を関数のスコープで別の型のシンボルfooで上書きしているから、barの方がいいか。
まぁ、なんだ、const修飾しとけと言いたかったんだ。

686 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 02:59:51 ]
>>685
つまりなんだ、関数名と構造体名と変数名は同時におなじものを使えるが、いまいちよくないということか

687 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 03:14:28 ]
構造体のタグは名前空間が違うからどうでもいいよ

688 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 03:20:18 ]
>687
そんなことはわかっているんだよ
関数名と変数が同じ名前だから、再帰呼び出しや関数ポインタが使えないと言っているわけで。

689 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 03:22:01 ]
>>688
おまえへのレスじゃねえよアホが



690 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 03:25:10 ]
粘着するつもりは無いが、
>688の変数というと語弊があるので、s/変数/仮引数/としておく。
まぁ、そうはいっても関数スコープのちょっと上で宣言された変数なんだけどね。
スタックですね、わかります。

691 名前:686 mailto:sage [2009/10/22(木) 03:29:00 ]
>>687
なるほど。ありがとう
ちなみにtypedefしちゃうとだめだよね?

>>688
あぁー、そういう弊害が出てくるんですね。為になります。

692 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 04:39:15 ]
func(&kouzoutai);
const付けたとしてもこの関数呼び出しの後でkouzoutaiのメンバが書き換わるのかどうかわからないすよね。
func(kouzoutai);
だったら書き換わらないことがわかるけど。
キャストすればいいのかな。。


693 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 06:26:12 ]
funcのシグネチャによるだろ

694 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 10:31:59 ]
>const付けたとしてもこの関数呼び出しの後でkouzoutaiのメンバが書き換わるのかどうかわからないすよね。
「呼び出しの後」が呼び出した関数内の話なら自己責任だろ。
「呼び出しの後」が呼び出した先の呼ばれた関数内の話ならその関数の宣言でconstポインタなら書き換わらないだろ。

695 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 10:48:08 ]
あえてconstをはがさない限りは変えられないんじゃないの?

696 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 12:13:14 ]
func()
{
  Kouzoutai kouzoutai;

  kouzoutai.member = 100; //func()では書き換えたい
  func2(&kouzoutai); //func2()では書き換えたくない。関数呼び出しからそれを明記できないか。
}

697 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 12:18:59 ]
>>696
void func2(const Kouzoutai * parameter);
func2()自体が書き換え可能なのだとしたら、呼び出すこと自体が無茶。

698 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 12:23:49 ]
func()
{
  Kouzoutai kouzoutai;
const Kouzoutai *kouzoutai_constptr = &kouzoutai;

  kouzoutai.member = 100;
  func2(kouzoutai_constptr);
}

699 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 12:38:38 ]
C++でも
func(const T &in, const T &in2, T *out) //定義
func(in, in2, &out) //呼び出し
みたいにして、呼び出しの記述を見て関数内で変更されうることが類推しやすくしたりするね

そういう意味では
func2((const Kouzoutai *)&kouzoutai)
でいいのかも知れんが、全部それやらないと本末転倒



700 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 13:11:12 ]
値渡しでいいだろ。速度も落ちねえよ。






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

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

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