- 1 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 15:48:19 ]
- C言語の*入門者*向け解説スレッドです。
★前スレ C言語なら俺に聞け(入門編)Part 59 pc12.2ch.net/test/read.cgi/tech/1263014439/ ★過去スレ 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 ★初心者、初級者の方は他の質問スレのほうが良いかもしれません。 例えば 【初心者歓迎】C/C++室 Ver.70【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1258873470/ とか ★教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 133代目 pc12.2ch.net/test/read.cgi/tech/1260532772/ ★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
- 96 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 17:52:44 ]
- 多少スレ違い気味で質問
str = {"234"} この代入が可能なのは C99 から?
- 97 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 17:53:33 ]
- amountという単語が有ってだな容量を表したりするんだ
maximumがゼロからカウントするかどうかに関わらず容量と
- 98 名前:88 mailto:sage [2010/02/02(火) 17:55:41 ]
- num[MAX-1]
で動きました。ありがとうございます
- 99 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:00:44 ]
- プログラムの設定ファイルの、読み込めなかった場合のデフォルトの値ってプログラムに埋め込んじゃうの?
- 100 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:01:27 ]
- >>99
yes
- 101 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:03:25 ]
- >>93
>何もはいってないですよね? いや、何だかわからない値が入っている。
- 102 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:06:59 ]
- >>101
str[3] は '\0' 固定じゃね?
- 103 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:09:38 ]
- 何が入るかは場所にもよるけどな。
しかし毎回変わるというのがグローバルっぽくないのだが、 容量を小さくしたい、というからにはグローバルなんだろうか。
- 104 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:11:19 ]
- >101
記憶クラスによる
- 105 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:12:53 ]
- malloc使って動的に確保すれば
char str[3][10]; str[0][10]〜str[2][10]に入れる文字列の長さが違ってもサイズ無駄なく格納できますか?
- 106 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:14:09 ]
- >>105
すきまができますね。
- 107 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:16:25 ]
- >malloc使って動的に確保すれば
から >char str[3][10]; の類推の段階で、無駄なくつめることができていない char* str[3] ならそう記述する可能性は高まるけど… ポインタと配列に関することは大丈夫か? と不安になる返答だね
- 108 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:18:02 ]
- >>96
オレも気になる
- 109 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:52:07 ]
- 試してみた
1^Inbsp;^Inbsp;int 2^Inbsp;^Inbsp;foo(void) 3^Inbsp;^Inbsp;{ 4^Inbsp;^Inbsp;^Inbsp;^Inbsp;char *foo; 5^Inbsp;^Inbsp;^Inbsp;^Inbsp;char bar[10]; 6^Inbsp;^Inbsp; 7^Inbsp;^Inbsp;^Inbsp;^Inbsp;foo = (char []){"abc"}; 8^Inbsp;^Inbsp;^Inbsp;^Inbsp;// 下と同じ 9^Inbsp;^Inbsp;^Inbsp;^Inbsp;// foo = (char []){'a', 'b', 'c', '\000'}; 10^Inbsp;^Inbsp; 11^Inbsp;^Inbsp;^Inbsp;^Inbsp;// foo = {"abc"}; 12^Inbsp;^Inbsp;^Inbsp;^Inbsp;// error : 左ブレースが異常 13^Inbsp;^Inbsp; 14^Inbsp;^Inbsp;^Inbsp;^Inbsp;foo[0] = 'q'; 15^Inbsp;^Inbsp;^Inbsp;^Inbsp;// ok : 書き換え可能 16^Inbsp;^Inbsp; 17^Inbsp;^Inbsp;^Inbsp;^Inbsp;foo = (char *){"abc"}; 18^Inbsp;^Inbsp;^Inbsp;^Inbsp;// foo = "abc"; と似たようなもの 19^Inbsp;^Inbsp; 20^Inbsp;^Inbsp;^Inbsp;^Inbsp;// foo = (char *){'a', 'b', 'c', '\000'}; 21^Inbsp;^Inbsp;^Inbsp;^Inbsp;// warning : 初期化子が多い 22^Inbsp;^Inbsp; 23^Inbsp;^Inbsp;^Inbsp;^Inbsp;// foo[0] = 'q'; 24^Inbsp;^Inbsp;^Inbsp;^Inbsp;// maybe : foo : char const * 25^Inbsp;^Inbsp; 26^Inbsp;^Inbsp;^Inbsp;^Inbsp;// bar = (char []){"abc"}; 27^Inbsp;^Inbsp;^Inbsp;^Inbsp;// error : bar : char * const 28^Inbsp;^Inbsp;^Inbsp;^Inbsp;(void)bar; 29^Inbsp;^Inbsp; 30^Inbsp;^Inbsp;^Inbsp;^Inbsp;return 0; 31^Inbsp;^Inbsp;}
- 110 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:53:44 ]
- >109 おっと、正規表現で&をエスケープしてなかった>110
1 int 2 foo(void) 3 { 4 char *foo; 5 char bar[10]; 6 7 foo = (char []){"abc"}; 8 // 下と同じ 9 // foo = (char []){'a', 'b', 'c', '\000'}; 10 11 // foo = {"abc"}; 12 // error : 左ブレースが異常 13 14 foo[0] = 'q'; 15 // ok : 書き換え可能 16 17 foo = (char *){"abc"}; 18 // foo = "abc"; と似たようなもの 19 20 // foo = (char *){'a', 'b', 'c', '\000'}; 21 // warning : 初期化子が多い 22 23 // foo[0] = 'q'; 24 // maybe : foo : char const * 25 26 // bar = (char []){"abc"}; 27 // error : bar : char * const 28 (void)bar; 29 30 return 0; 31 }
- 111 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:56:58 ]
- インデントは専ブラにやらせるのが楽
- 112 名前:デフォルトの名無しさん [2010/02/02(火) 23:17:10 ]
- codepad
ttp://codepad.org/ 長いソースを貼るときはここへ! ってテンプレートに入れようぜ。
- 113 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 23:38:54 ]
- お前が立てるときに足せばいいじゃないか
- 114 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 23:50:30 ]
- >>109
検証下手だなぁ
- 115 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 00:34:09 ]
- 配列 int out[3]={1,5,3};
の配列の各要素の大小関係を比べるプログラムをfor文で作りたんですけど どうすればいいですか?
- 116 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 00:36:39 ]
- 宿題は宿題スレへ
- 117 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 00:37:09 ]
- >>115
バブルソートでググればおk
- 118 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 00:41:28 ]
- >>116
わかりました。 宿題スレに行きます
- 119 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 11:56:08 ]
- 最近気づいたんだが、固定幅フォントより非固定幅のほうが目に優しいわ
- 120 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 12:31:20 ]
- >>119
これ? プログラミングはプロポーショナルフォントの方が読みやすい ? slashdot.jp/developers/article.pl?sid=10/01/20/025204
- 121 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 14:21:11 ]
- #defineで定義されたマクロの有効範囲は#undefされない限り翻訳単位内のみとのことですが
#define HOO foo という定義を含むファイルをincludeした場合 includeした側にもこのマクロが適用されると言うことでしょうか
- 122 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 14:23:36 ]
- >>121
yes そうでないと インクルードガードが効かなくなっちゃう
- 123 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 14:24:03 ]
- そうだよ
意識しなくても標準ライブラリで#defineされたものを普通に使ってると思うけど
- 124 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 14:27:41 ]
- 逆にファイル外に伝播して欲しくない場合はundefで明示しないといけないと言うことですね
ありがとうございました
- 125 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:16:34 ]
- 二つの文字列を連結させるプログラムを書いたんですが
以下のままでは文字列終端のNULL処理がされていないと言われました mojiC[100]の中身を初期化した時点でNULL処理できている気がするんですが #include<stdio.h> int main(void) { /* 連結した文字列を格納するのに十分な長さの配列 */ char mojiC[100] ; /* 連結元の文字列 */ char mojiB[] = "World" ; char mojiA[] = "Hello" ; /* 連結を行うプログラム */ int i, j; for(i=0;i<100;i++){ //mojiC[100]の中身を初期化 mojiC[i]=0; } for(i=0;mojiA[i]!=0;i++){ //mojiC[100]にmojiA[]の中身をコピー mojiC[i]=mojiA[i]; } for(i=0,j=0;mojiC[i]!=0;i++,j++){ } for(i=0;mojiB[i]!=0;i++,j++){ //mojiC[100]にmojiB[]の中身をコピー mojiC[j]=mojiB[i]; } printf("%s\n", mojiC) ; /* HelloWorld と表示 */ return(0) ; }
- 126 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:19:35 ]
- 100+300では駄目だろ 100個しかしてないからな
- 127 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:22:27 ]
- memcpyつかった方が転送効率良いよ。
どんな長さでも動くようにするには、動的確保。 あと初期化する必要なし、手間がかかる。 動的確保 -> memcpyでデータ配置 -> 最後にNULL付加でよし
- 128 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:24:54 ]
- >>125
>文字列終端のNULL処理 NULL じゃねえ、'\0' 或いは NUL。 てのは置いといて、 >できている気がするんですが できてる。 無駄は多いけどな。 (2つ目のループは j = i; とすれば要らないだろ、とか)
- 129 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:26:39 ]
- NULLってのとナル文字(ヌル文字?)の区別を学ぼう。
char c = '\0'がそれ。 あと、char mojiC[100] = {'\0'};こういうことをしておけば、 「mojiC[100]の中身を初期化」の部分は不要。 ただ、普通は配列を初期化なんぞしないで、 文字列をコピーした最後に'\0'をくっつけるのフツー。
- 130 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:27:34 ]
-
こんなふうだ。 mojiwa(char *p, char *a ,char *b,){ int m=strlen(a); int n=strlen(b); char *p = (char *)malloc(m+n); memcpy(&p[0],a,m); memcpy(&p[m],b,n); p[m+n]=NULL;; }
- 131 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:27:49 ]
- かぶった。>>129は>>125宛て。
- 132 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:32:38 ]
- >>127
>memcpyつかった方が転送効率良いよ。 それ言うなら strcat 使え、って話に… まあ習作なんだろうから、自分でコピーしてみるのはアリかも知れん。
- 133 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:34:06 ]
- >>132
ですよねー
- 134 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:36:45 ]
- >130
やべぇ、何やってんのかさっぱりわからん
- 135 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:37:00 ]
- 勉強のためなんだろうから、あえて使ってないんだろう。
最初にj=0にしておけば、mojiCへの代入はすべて mojiC[j++]= とやれば途中のj++の部分は全部消せる。 最後にmojiC[j++]='\0';とかいれとけ
- 136 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:43:51 ]
- strlen memcpyという関数を自作すれば見通し良い。
- 137 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 18:14:08 ]
- 同一名称、あるいは酷似した名称を使うのは
車輪の再発明で悦に入る行為かもな 内容は同じなライブリ関数を自作して使用するの は悪いこととは限らないといった程度
- 138 名前:やってみた mailto:sage [2010/02/03(水) 18:16:48 ]
- void *
memcopy(void *d1, const void *s1, size_t sz) { char *d2 = d1; const char *s2 = s1; while (sz-- > 0) *d2++ = *s2++; return d1; }
- 139 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 19:02:08 ]
- int m=strlen(a); // 超違和感
- 140 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 19:03:45 ]
- 何故sprintf()を使わないのか?無意味な苦労はバグを生むだけ。
- 141 名前:デフォルトの名無しさん [2010/02/03(水) 19:18:46 ]
- 無意味な苦労でも、車輪の再発明でも、実装を知っていることは良いことだ。
日本のイット業界なんかアルゴリズム詳しく知らなくても仕事できちゃうもん。 あはは。
- 142 名前:推奨 mailto:sage [2010/02/03(水) 19:51:46 ]
- 実装など実務経験の間に自然に知って欲しかった
というのはあるかも知れないが いつの時代でもコンスタントにそれが 出来るとは限らない とりわけ露出狂時代にはね。
- 143 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 22:53:58 ]
- >>141
だって、技術者じゃなくドカタだもん
- 144 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 23:07:14 ]
- アルゴリズムってなに?
- 145 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 23:08:48 ]
- >>144
Wikipedia読んで、それでもわからなかったら、丸一日考えて、 それでもわからなかったら、何がわからないのか質問しなさい。
- 146 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 09:22:26 ]
- >>144
いーっぽすすんでまえならえ〜♪
- 147 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 10:37:05 ]
- コンパイル環境のエンディアンを調べるれるようなマクロとかってある?
それか明示的にエンディアン指定できるpragmaとかあればいいんだけど
- 148 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 11:23:22 ]
- こういうのか
ttp://www5d.biglobe.ne.jp/~noocyte/Programming/CMacros.html#DetermineEndian
- 149 名前:デフォルトの名無しさん [2010/02/04(木) 15:43:38 ]
- #include <stdio.h>
/* 整数の2進表現を下位から表示 */ int main(void) { int n, b; n = 0; do { b = n % 2; printf("%d\n", b); n /= 2; } while (n > 0); return 0; } このプログラムをn=0にしたときに同じ結果を得るにはどうしたらいいのですか?
- 150 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 15:46:26 ]
- if(n==0)で0の時だけ処理分ける
- 151 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 15:48:50 ]
- >>149
何と同じにするのか分からん
- 152 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 15:58:59 ]
- >>149
2進数はビット演算子を使うのが常套手段じゃないのかな? int n; n = 15; do { printf("%d\n", n & 1); } while ((n >>= 1) > 0);
- 153 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 16:03:20 ]
- >>152 n進数への応用がきかない。
- 154 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 16:14:42 ]
- #include <stdio.h>
int main() { int n = 7, i; for (i = 0; i < sizeof n * 8; i++) { printf("%d\n", !!(n & (1 << i))); } return 0; }
- 155 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 16:35:11 ]
- そもそも>>151の言うように、どういう出力を期待してるのか
質問者は書いてみてくれないか
|

|