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

【ANSI-C】 C言語なら俺に聞け!  Part 129

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/08/27(日) 15:43:44
このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

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

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
【ANSI-C】 C言語なら俺に聞け!  Part 128
http://pc8.2ch.net/test/read.cgi/tech/1151282084/


GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。

【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145524/
C/C++の宿題を片付けます 73代目
http://pc8.2ch.net/test/read.cgi/tech/1155355501/
新・推薦図書/必読図書のためのスレッド 1
http://pc8.2ch.net/test/read.cgi/prog/1146889623/
0004デフォルトの名無しさん2006/08/27(日) 16:05:15
C言語でエロゲー作れますか?
0005デフォルトの名無しさん2006/08/27(日) 16:09:28
>>2
ない

>>3
ちんこ弄ってるだけよりは可能性がある

>>4
エロいのは無理
0006デフォルトの名無しさん2006/08/27(日) 16:16:23
>>5
じゃあ、将来性のある言語ってなんですか?
0007デフォルトの名無しさん2006/08/27(日) 16:23:38
業務やるならJava使っとけ。
WindowsならC#使っとけ。
ゲームとか組み込みとか貧弱なOSで生バイナリ使う必要あるならC++一択。
C99はプロのCプログラマが使う上で有利な多数の拡張が施されているが、
C++とかなりの機能がダブっており、生粋のC屋以外には半ば無用の言語。
そしてスレ違い。
0008デフォルトの名無しさん2006/08/27(日) 16:42:34
わかりますた
0009デフォルトの名無しさん2006/08/27(日) 16:56:03
業務でWindowsの場合は?
0010デフォルトの名無しさん2006/08/27(日) 17:24:35
void func(char str[]){
static int num=strlen(str);
     :
     :

このような事をやろうと考えていたんだが、static属性の付いた変数に定数以外の値を代入しようとするとコンパイルエラーになる。
かと言ってそれだけの為に毎回値を渡したり計算させたりするというのもスマートじゃない。
知恵を貸してくれないか?
0011デフォルトの名無しさん2006/08/27(日) 17:31:42
>>10
いやです。
0012デフォルトの名無しさん2006/08/27(日) 17:37:57
>>10
そりゃ初期化子に書くからいかんのだ。
static int num;
     :
num=strlen(str);

と書けば問題なかろうが。
ところで、staticの意味はわかっておろうな?
0013デフォルトの名無しさん2006/08/27(日) 17:52:42
int main( int argc, char **argv){
printf("%d\n", sizeof(argv[argc - 1]));

return 0;
}

と言うコードをコンパイルして、
./a.out 12としても、./a.out 123456としても
4が出力されます。 実行時の引数に渡した値(上記の場合12, 123456)
のサイズを調べたい場合はそうすればいいのでしょうか?
0014デフォルトの名無しさん2006/08/27(日) 17:54:30
>>13
strlen
0015デフォルトの名無しさん2006/08/27(日) 17:55:42
sizeofとstrlenと一緒だと思うか?
0016132006/08/27(日) 17:56:45
>>14
早速有難うございます。
できればsizeofでやりたいのですが、
sizeofでする方法はございませんでしょうか?
0017デフォルトの名無しさん2006/08/27(日) 17:57:46
ない。
求めたいのは「文字列の長さ」なのか「charへのポインタのサイズ」なのかどっちだ?
0018デフォルトの名無しさん2006/08/27(日) 18:02:18
sizeofはコンパイル時に評価されるから引数で渡された文字列の長さなんて求められない。
0019デフォルトの名無しさん2006/08/27(日) 18:30:12
ひょっとして、入力された数値を求めたいだけだったりして
0020デフォルトの名無しさん2006/08/27(日) 18:37:34
そもそも>>13が調べたい「サイズ」が不明なうちは、考えても無駄なので、シカト
0021デフォルトの名無しさん2006/08/27(日) 18:42:21
>>12
2度目の呼び出し時以降は宣言しないため初期化しないと思っていた、勘違いだった。
激しくサンクス。
0022デフォルトの名無しさん2006/08/27(日) 19:52:38
char* foo(void){
  char*hoge="hogehoge";
  return hoge;
}

int main(void){
  char *piyo;
  piyo=foo();
  printf("%s",piyo);
}

このようにプログラムを書いたとき、関数fooを抜けた時点で"hogehoge"へのポインタを参照いることに問題はありませんか?
0023デフォルトの名無しさん2006/08/27(日) 19:53:15
問題ないよ。
0024デフォルトの名無しさん2006/08/27(日) 19:53:24
>>22
実行してみた?
0025デフォルトの名無しさん2006/08/27(日) 19:55:01
>参照いること
日本語でおk
0026デフォルトの名無しさん2006/08/27(日) 20:03:57
>>22
文字列リテラルのアドレスだから問題ないが、同じ調子でローカル変数のアドレスなんか返すんじゃないぞ。
0027デフォルトの名無しさん2006/08/27(日) 20:04:28
>>22
正常に動作していても、それはたまたま動いているだけで、問題はあるよ
0028デフォルトの名無しさん2006/08/27(日) 20:07:56
この場合に限っては問題ない。
0029デフォルトの名無しさん2006/08/27(日) 20:11:42
この場合に限ってと限定するか、本来はどう考える事なのかまで踏み込むか。

どっちでもいいか。
別にどうでもいいし。
0030デフォルトの名無しさん2006/08/27(日) 20:13:59
K&Rで文字列リテラルの扱いを確認してみるべし。
0031デフォルトの名無しさん2006/08/27(日) 20:17:00
main関数から以下のような感じの関数(Henkan)を呼んで、main関数で変換後の文字列とバイト数を表示したいんだけどやりかたがわかりません。
どなたかわかるかたいませんか?

int Henkan (変換の文字列,変換後の文字列,変換後のバイト数)
0032デフォルトの名無しさん2006/08/27(日) 20:20:13
>>9
なかなか言うねえW
0033デフォルトの名無しさん2006/08/27(日) 20:35:58
>>31
日本語でおk
0034デフォルトの名無しさん2006/08/27(日) 21:53:24
>>29
限定しておるわけではない。
ANSI-Cの規格に従う限り、このプログラムは正しく動くはずだと言っておるのだ。
0035デフォルトの名無しさん2006/08/27(日) 22:26:36
>>31
変換関数から変換後の文字列とバイト数を戻してもらいたいと言うことかな?
まぁ、初心者スレにでも逝ってくれ。
0036デフォルトの名無しさん2006/08/27(日) 23:08:40
>31
変換って何に変換するんだ。
何の文字列をなんに変換するんだ?
ひらがなから漢字に変換するのか?
0037デフォルトの名無しさん2006/08/28(月) 00:29:04
>31
printf("%s %d\n",変換後の文字列,変換後のバイト数);
0038デフォルトの名無しさん2006/08/28(月) 16:09:22
#include<stdio.h>
int main(){
  char *str="test";
  str[0]='b';
}

このようなコードを書いて実行すると「STATUS_ACCESS_VIOLATION」というエラーがでて強制終了してしまいます。
Googleで検索してみたのですが難しい事が書いてあってよくわからず、かろうじて領域破壊が発生している可能性があることだけ読み取れました。
ですが上記コードのstr[0]を出力してみるとtが入っている事が確認でき、ますますわからなくなってしまった次第です。
よろしければこれの原因と解決策を教えてください。
0039デフォルトの名無しさん2006/08/28(月) 16:19:34
文字列リテラル書き換えようとしたらコケて当然じゃ。
0040デフォルトの名無しさん2006/08/28(月) 16:20:21
return 0;
0041デフォルトの名無しさん2006/08/28(月) 16:26:50
>>38
文字列リテラルが書き換え可能な領域に置かれる事は一切保証されない。
書き換え不可の領域に置かれた状態で書き換えようとすればエラーが出て当然だわな。
0042デフォルトの名無しさん2006/08/28(月) 16:29:55
#include<stdio.h>
int main(){
  char str[]="test"; /* 書き換え可能な場所にコピーする */
  str[0]='b';
  return 0;
}
0043デフォルトの名無しさん2006/08/28(月) 21:54:20
>>42
実装に踏み込んだ怪しいコメントだな。
「書き換え可能な配列として初期化する」のほうがいいだろう。
0044デフォルトの名無しさん2006/08/29(火) 03:49:16
「配列を用意してリテラルで初期化する」かな
0045デフォルトの名無しさん2006/08/29(火) 17:50:42
・文字列が定数でないなら、char*ではなく配列にする
・文字列が定数ならconstを付けてバグを防ぐ
0046デフォルトの名無しさん2006/08/29(火) 17:54:45
・必要なときにキャストでconstを外すニダ<丶`∀´>
0047デフォルトの名無しさん2006/08/29(火) 17:55:46
>>46
意味ねーだろーが
0048デフォルトの名無しさん2006/08/29(火) 20:50:25
ネタにマジレス…
0049デフォルトの名無しさん2006/08/29(火) 21:01:07
(・∀・)カコイイ!!
0050デフォルトの名無しさん2006/08/29(火) 23:51:44
stdin からの入力を scanf で受け取るときに scanf は改行\nまで
読み取ってくれず連続して scanf を使うとき上手く動作しないトラ
ブルで、これの解決パターンは何通りもあるけど、このまとめサ
イトとか、このイディオムというかいろいろな解法を扱っているとこ
ろ知ってる人いますか?

少しCから離れてしまうと、このイディオム忘れちゃって…
0051デフォルトの名無しさん2006/08/29(火) 23:56:05
俺はバッファサイズに一行の長さが縛られることになるから
あんまり好きな書き方じゃないけど
fgets + sscanfとかが代表的な逃げ方だな。

あとはscanf("%*[^\n]");scanf("%*c");でも叩き込んで改行まで殺すとか.
0052デフォルトの名無しさん2006/08/30(水) 00:01:16
そうそう、そういうCの良く使うイディオムをまとめてあるサイトとかです。
>>51少しCから離れると、そういうの忘れちゃいませんか?
0053デフォルトの名無しさん2006/08/30(水) 00:03:08
辞書買えば?
0054デフォルトの名無しさん2006/08/30(水) 00:37:47
>>53
突然に、辞書って何のこと
英語の辞書??
0055デフォルトの名無しさん2006/08/30(水) 00:59:40
C言語の辞書
0056デフォルトの名無しさん2006/08/30(水) 01:10:56
>>53=55
m9(^Д^)プギャー
0057デフォルトの名無しさん2006/08/30(水) 01:12:59
オレは>>52じゃないんだが、>>55はC言語辞典(平林)とかのことか
それとも上で言っているイディオムとか、痒いところに手が届くようなお勧め辞書があるということ?

そんな辞書あったらオレにも教えてくれよー
0058デフォルトの名無しさん2006/08/30(水) 01:34:51
このスレではまったくスレ違いじゃないんだろうけど、
とりあえず時代には逆行してるよね。
0059デフォルトの名無しさん2006/08/30(水) 02:01:21
>>58
C99が流行らずにC#,java,スクリプト言語全盛なのは
C99が時代に取り残されそして逆行していると解釈してOKね
0060デフォルトの名無しさん2006/08/30(水) 02:06:37
>>59
いやいや、C99はC++との互換性を無視したので、これから新しい
プログラムをC99で書いた物をC++に移植する時に大変な手間が
必要になるのも一因でしょう。

CPUに例えれば、x86がセグメント方式という8086当初の汚点を
未だに引きずっても互換性を重視した結果バカ売れしたのに対し、
Motorolaの流れはColdfireのような組み込み系に変わって行って
しまったのに似てますね。まあ制御系はCPUの数だけから言えば
PCで使われている数よりもずっと多いんですけども。
0061デフォルトの名無しさん2006/08/30(水) 02:09:40
C99は何であんな方向に枝を伸ばしたのかね。
C++との住み分けのつもりなのかな。
0062デフォルトの名無しさん2006/08/30(水) 02:12:13
棲み分けの割にはD言語みたいな立場になってますよね。
ベンダーもなかなかC99対応のコンパイラ出さないし。ICCとかは
完全対応してるんだっけ。

まあD言語みたいにマニア向けの色が強くなってると思う。
0063デフォルトの名無しさん2006/08/30(水) 02:16:12
今更C99に対応するくらいなら、それまでのC++伸ばす方に注力しそうなもんだよね、ベンダ側も。
つーかあと5年は早く出しとけよって感じだ。
0064デフォルトの名無しさん2006/08/30(水) 02:21:40
>>63
いやあと8年早く出て欲しかった。そしてC99の上位互換性を持つC++が
作られるという流れにして欲しかったなあ。

C99の致命的な欠点はクラスが作れないという事です。OOPをするのに
C言語と同じ苦労をしなければいけない。これは生産性に重大に関わります。
0065デフォルトの名無しさん2006/08/30(水) 02:24:35
ベンダーとか言うけど、C++,C#,javaの方に目がいっていて無理してC99はまったく対応するつもりないんじゃない?

必要な人はgccあるし、あえてCに戻ってもらっても困るしさ。

そして、言語仕様をいっぺんに拡張してまったく別物のようになってしまって、対応コンパイラも普及してないからマニア向けな感じがするのかな。
どのあたりをターゲットと見据えて言語拡張したんだろ。
0066デフォルトの名無しさん2006/08/30(水) 02:28:24
>>64 Cがクラス作れない(というかオブジェクト指向ではない)のは自明の事なので、そういうことを期待すること事態ナンセンスだと思うのですが・・
生産性とかも、CにはCのよさがあって、クラスとかなら他の言語でゴニョゴニョ・・
0067デフォルトの名無しさん2006/08/30(水) 02:31:02
>>64
OOPに関して問題を感じるなら、
C++を推進するとか、他のOOPLを推進するとか、
どっちにせよCを離れるが吉だと思われ。w
0068デフォルトの名無しさん2006/08/30(水) 02:31:49
構造体とポインタがあるから満足してます
0069デフォルトの名無しさん2006/08/30(水) 02:31:57
まあ組み込みや制御系には吐き出すバイナリが小さくなる傾向が
あるCやC99を使うでしょうね。友人がC++の組み込みプログラムを
書いてるんですけど、STLはばっさりけずられてるし、言語仕様も
結構縮小されて、出来るだけバイナリを小さくするようにしてるそうです。
0070デフォルトの名無しさん2006/08/30(水) 02:35:00
>>69
Embedded C++ だな。日本の企業が実装の難しい機能をばっさり削って
「Embedded C++ 準拠」と宣伝したいがために策定した規格。

作成意図がほんとでこんなんじゃないかと信じてしまうほどの糞規格。
0071デフォルトの名無しさん2006/08/30(水) 02:41:15
>>70
はい、それですまさに。プログラムの保守性と生産性を保つために
クラスだけは残したような。
0072デフォルトの名無しさん2006/08/30(水) 02:42:50
Cは、PCでアプリケーション全体を記述するよりも
組み込みとか、速度重視とか、バイナリ小さくとか、描画速くとか
そういったかゆいところで本領発揮する、実によくきく薬なんで
しょう。
C99の拡張も特にPC向けを考慮しているわけではないと思うけど
0073デフォルトの名無しさん2006/08/30(水) 02:43:32
まさか組み込み最強の力の一翼たるテンプレート類も使えないとか?
そんなことないよね?
0074デフォルトの名無しさん2006/08/30(水) 02:54:25
>>73
http://ja.wikipedia.org/wiki/Embedded_C++
0075デフォルトの名無しさん2006/08/30(水) 02:58:27
>>74
読んだ。

固まった。
顎が落ちた。
なんだこりゃ。
C++じゃねえじゃん。

マジで>>70が言うとおりコンパイラ実装側が手を抜くためとしか思えんな!
誰が使うんだ、こんな糞規格って

>>71が可哀想すぎる…
こんなのってないよ…
0076デフォルトの名無しさん2006/08/30(水) 06:59:23
Cへのトランスレータが当たり前だった極初期のC++を思い出すな。
今更名前にC++が入ってるのは詐欺だな。
0077デフォルトの名無しさん2006/08/30(水) 07:32:38
http://www.caravan.net/ec2plus/committee.html
委員会のメンバが胡散臭すぎる。
0078デフォルトの名無しさん2006/08/30(水) 10:02:29
void a () {
return;
}

void b () {
return a ();
}

これとくに警告とか出ないんですけどこういう書き方正しいんでしたっけ?
return a ();のところ
0079デフォルトの名無しさん2006/08/30(水) 10:04:55
>>78
C++ では有効。それが無いと template 書くときに困る。
0080デフォルトの名無しさん2006/08/30(水) 10:10:08
そうでしたよね確かCだとダメだと記憶してたんで
gcc使ってたんですけど今-pedanticというオプションつけたら警告出ました
それつけわすれてました
0081だいころ2006/08/30(水) 11:45:16
みなさん、C++ソースのドキュメント作成で、
何か良いフリーのソフトを配布しているサイトをご存知でしたら、
教えて貰えないでしょうか。
宜しくお願いします。
0082デフォルトの名無しさん2006/08/30(水) 11:53:21
>>81
    へ          へ|\ へ     √ ̄|        へ
   ( レ⌒)  |\   ( |\)| |/~|  ノ ,__√    /7 ∠、 \ .  丶\      _ __
|\_/  /へ_ \)   | |   | |∠  | |__   | /   !  |     | |_〜、  レ' レ'
\_./| |/   \     .| |( ̄  _) |     )  | |    i  |  へ_,/    ノ   ,へ
  /  / ̄~ヽ ヽ.   | | フ  ヽ、 ノ √| |   ! レノ  |  !. \_  ー ̄_,ー~'  )
 / /| |   | |   | |( ノ| |`、) i ノ  | |   \_ノ  ノ /    フ ! (~~_,,,,/ノ/
 | |  | |   / /    | | .  し'  ノ ノ   | |       / /     | |   ̄
 \\ノ |  / /      | |___∠-".   | |      ノ /       ノ |  /(
  \_ノ_/ /     (____)     し'      ノ/      / /  | 〜-,,,__
     ∠-''~                        ノ/         (_ノ   〜ー、、__)
0083取り敢えずdoxygen2006/08/30(水) 11:54:13
>>81
スレタイ読めますか?
0084デフォルトの名無しさん2006/08/30(水) 12:45:52
「C言語によるアルゴリズム辞典」
「明解C言語入門編」
「解きながら学ぶC言語」
「プログラミング言語C」
で勉強していこうと思います。
これらで効率よくプログラミングを学んでいける方法、
読み方を教えてください。
0085デフォルトの名無しさん2006/08/30(水) 12:47:11
>>84
1ページ目から始めて、最終ページまで読めばいいと思うよ。
0086デフォルトの名無しさん2006/08/30(水) 12:52:22
目次と索引は飛ばして読んだ方が効率いいと思うよ。
0087デフォルトの名無しさん2006/08/30(水) 13:07:39
>>81
doxygenでも使え。
0088デフォルトの名無しさん2006/08/30(水) 13:14:14
>>84
最近の初心者は最初からやるべき参考書を沢山ピックアップしすぎ。
1冊何か読んでちゃんと理解すれば次に何を読むべきかわかるから、
その時に2冊目を買えばいい。何にもわからないうちに買い置きするのは危険。

解きながら学ぶC言語って、明解C言語入門編例解演習の改定本だろ?
明解C言語入門編と相当内容が被っているから両方買った時点で効率悪すぎ。
0089デフォルトの名無しさん2006/08/30(水) 13:22:02
>>88
そうです。明解Cは少しずつ読み進めていて、
問題もたくさん解いたほうがいいのかなと思って購入してしまいました。
明解だけに絞って進めていこうと思います。

最初問題を解くときなどは、問題を見たら
すぐに回答を見て理解しながら自分で写すいった方法でいいのでしょうか?と
それとも時間をかけまず1から自分で全部考えてみてから回答を見て、
こういう方法でやるんだ、と納得して次に進む方法がいいのでしょうか。
後者だと時間が結構かかってしまいます。
0090デフォルトの名無しさん2006/08/30(水) 13:28:39
例えばさ、俺の友人は数学を勉強する時、問題を読んで答えをみて、それだけで人に教えられるほど理解できていた。
しかし俺はそんな超人的なことは無理で、問題をよく考えて解説を何度も読んで、それでなんとか理解できる程度。

何が言いたいかというとだ、こんな所で聞く時間があったら1ページでも多く読め
0091デフォルトの名無しさん2006/08/30(水) 13:30:18
「効率よく」という言葉はちょっと違ったかもしれません。
大学受験勉強は、問題を見てすぐ答えを見てその流れを理解して覚える、
といったような方法を取ってきていたのですが、
プログラミングとなるとどう勉強していったら分からないといったところが
率直なところです。
大学では、ちょこちょこと説明した後課題が出されて、
それについて自分でいろいろ調べといていくといったやりかたでやってますが
自習となるとちょっと・・・
0092デフォルトの名無しさん2006/08/30(水) 13:33:25
自分でやりたいことを記述できるようになる為の勉強に効率なぞない

テストで良い点を取るための勉強とは違うのだよ
0093842006/08/30(水) 13:35:32
>>90
わかりました。
>>92
重みのある言葉ですね。何か心に響きました。
ありがとうございます。
0094デフォルトの名無しさん2006/08/30(水) 13:49:51
>>91
>大学受験勉強は、問題を見てすぐ答えを見てその流れを理解して覚える、

なにその非効率な勉強方法
解きもしないで身につくわけがない
C言語も同じ
0095デフォルトの名無しさん2006/08/30(水) 13:52:27
>>94
宿題を提出したり、テスト当日漬けには物凄く効率はいいがな。
ただ、指摘どおり身に付かないので追えなくなったらニート確定w
0096デフォルトの名無しさん2006/08/30(水) 13:53:52
もひとつ追加すると、周りから実力を過大評価され過ぎて
落ちたときにつらいw
0097デフォルトの名無しさん2006/08/30(水) 14:02:19
大学受験であれば>>91の方法は時と場合によっては効率的。
一概に非効率だとは言い切れない。
だがプログラミングの勉強においてその方法は何の役にも立たない。
0098デフォルトの名無しさん2006/08/30(水) 14:18:16
プログラム言語なんてものは、自分で書いて、コンパイルエラー出して、
実行させて思う通りに動かなくて悩んで・・・そうやって憶えるもんだ
0099842006/08/30(水) 14:39:53
>>94-95
大学受験でこの勉強方法が効率的だった(というか自分に合っていた)というのは
実体験も含めて分かってます。ここでそれは特に説明はしません。
>>94>>97>>98で言われているように
プログラミングに関しては効率的ではないことは分かりました。
ただ、初歩の部分というのは覚えだけのことが多くありますよね。
それにも>>98の方法が本当に効率的なのかというのは疑問でもあります。
もうちょっと参考書の使い方の部分まで考えていきたいのです。
例えば、
まずその章の説明を読んで例題を読む。
次にそれを自分で書き写しながら理解していく。
そこから同じことを使う練習問題を何題か解いてみる。

というような感じで。
0100デフォルトの名無しさん2006/08/30(水) 14:42:39
なぜそこで効率を問う?
早く理解すること より 正しく理解すること のほうが重要な分野だぞ?
0101842006/08/30(水) 14:46:36
>>100
なるほど。としか言い様がありません。
プログラムの経験が極浅いために、
イマイチ受験的な考えから抜け出せない感じです。
0102デフォルトの名無しさん2006/08/30(水) 14:48:55
固定的概念から抜け出せない奴も(ry
0103デフォルトの名無しさん2006/08/30(水) 15:09:50
>>99
人にアドバイスを貰っておいて、今度はそれを疑いだすとか基地外か?
第一、今のお前には、どんなアドバイスを貰っても
それが本当に効率的かどうかを判断できる能力が備わってないだろ。

本当は自分の中である程度勉強法が固まっていたものの、
不安だったので背中を押してもらおうとスレ住民に聞いたが、
反発されたのでうだうだ言っている。そんな風にしか見えない。
■ このスレッドは過去ログ倉庫に格納されています