C言語なら俺に聞け( ..
97:デフォルトの名無しさん
07/05/09 18:52:22
高級言語から入るとこれだからいかんな。
アセンブリ言語の洗礼を受けてくるといい。
98:デフォルトの名無しさん
07/05/09 18:59:53
>>97
すいません。8080, Z80, 6502, 6800, 68000 ぐらいまでしかやってません。
この頃の x86 系についてはよく分かりません。
99:デフォルトの名無しさん
07/05/09 19:00:42
釣り来た
100:デフォルトの名無しさん
07/05/09 19:26:05
rubyはかなり分かってます。
linuxの為にCを勉強しています。当然です。ちなみにVine
101:デフォルトの名無しさん
07/05/09 19:27:04
釣りくせー
102:デフォルトの名無しさん
07/05/09 19:29:37
「かなり分かっています」 と自信を持って言う奴の 99% は、大して分かっていない。
なぜなら、言語の奥深さを知ってる者は、おいそれとそんな事は言えないからだ。
ほんの一握りのエキスパートか、Ruby 処理系の開発者か、
そうでなければ見栄っ張りの小物にしかそんな事は言えん。
103:デフォルトの名無しさん
07/05/09 19:48:15
というかこういうやつほどコテつけて欲しいな
ただの騙りの可能性も否定できないし
もしすべて本人だったらかなり・・・
104:デフォルトの名無しさん
07/05/09 20:05:58
Linux上で動くアプリケーションを作りたいだけなら、g++使えばいいだろうし、
Linuxのメジャーなディストリビュージョンなら、
g++がない(gccや下手したらccだけしかない)なんて状況を仮定する必要なんてないはず。
また、完全な互換性がない今のC++でも、それなりにCらしいコードも書けるし。
このスレで出てくるようなコードなら、ほとんどvoid*周りしか問題にならないと思う。
105:デフォルトの名無しさん
07/05/09 20:30:07
なんか勘違いしている香具師が多いようだが、Cでも可変長配列はあるぞ。
それから、malloc()などで確保した領域を配列のように運用することはできてもそれは配列じゃないぞ。
#まぁ、可変長配列も伸び縮みできるわけじゃないがな。
106:デフォルトの名無しさん
07/05/09 20:32:41
C99 なんてあってないような規格で語られてもな。
107:デフォルトの名無しさん
07/05/09 20:33:53
意味わからん
108:デフォルトの名無しさん
07/05/09 20:38:23
>>106
身近なところではgcc, icc, SunのccがC99準拠なんだが。
後二者はデフォルトだし。
109:デフォルトの名無しさん
07/05/09 20:39:02
しかし、ほとんど使われていないのもまた事実。
110:デフォルトの名無しさん
07/05/09 20:40:00
自分が使えないからといって、無闇に否定するのは如何な最中と。
111:デフォルトの名無しさん
07/05/09 20:40:08
お前が使ったこと無いだけ
112:デフォルトの名無しさん
07/05/09 20:42:20
>>105
どうやるんですか?可変長配列
113:デフォルトの名無しさん
07/05/09 20:42:49
VC が準拠しない限り、使用人口は増えない。
114:デフォルトの名無しさん
07/05/09 20:43:57
C99がOKでC++駄目ってのがよくわからん
115:デフォルトの名無しさん
07/05/09 20:43:59
>>112
URLリンク(seclan.dll.jp)
つーか、なんで「C99」ってキーワードまで書かれてるのに
自分で調べようとしないんだろうな
116:デフォルトの名無しさん
07/05/09 20:46:11
使った事ないんじゃなくて、使う気がしないだけ。
117:デフォルトの名無しさん
07/05/09 21:24:47
#include <stdio.h>
int main (void){
int a[3]={1,2,3};
a[3] = 4;
printf("%d\n", sizeof(a)/sizeof(a[0]));
printf("%d\n", a[3]);
return 0;
}
どうしてだお?
118:デフォルトの名無しさん
07/05/09 21:27:47
>>117
printf("%d\n", a[3]); // Access Violation
119:デフォルトの名無しさん
07/05/09 21:28:22
でないお
gccだけど
120:デフォルトの名無しさん
07/05/09 21:29:30
どっちかっつーとこっちのがヤバい。
a[3] = 4;
121:デフォルトの名無しさん
07/05/09 21:30:05
size is 3
a[3] is 4
こうなったお
122:デフォルトの名無しさん
07/05/09 21:30:16
a[0] = 1;
a[1] = 2;
a[2] = 3]
a[3] = ?
123:デフォルトの名無しさん
07/05/09 21:30:19
どうしてって何が?
124:デフォルトの名無しさん
07/05/09 21:31:27
不変な表明ってこういうときに役に立つの?
125:デフォルトの名無しさん
07/05/09 21:37:05
Cに不変表明なんかないだろ。
126:デフォルトの名無しさん
07/05/10 00:32:21
assertがそれにあたるんじゃ
127:デフォルトの名無しさん
07/05/10 00:37:21
>>117のなんて、そもそもインデックスと要素数の関係自体理解できてないんだから
assertとかそういう次元の問題じゃないだろ
あれは何かの拍子で変な値がインデックス用の変数に入り込んだりするのを発見するため
128:31
07/05/10 02:07:35
>>32
それはわかるんだけど、それから先が全くわからなくて・・・
というかまず何を書けばいいのかもわからない・・・ド素人でスマン。
助けて・・・
129:デフォルトの名無しさん
07/05/10 02:09:41
きもちわる・・・
130:デフォルトの名無しさん
07/05/10 02:23:34
webマトリックスてなんすか?
とりあえずGET,POSTとだけ言ってこ
131:デフォルトの名無しさん
07/05/10 09:18:45
アク禁
132:デフォルトの名無しさん
07/05/10 14:51:22
>>117
もしや a[3] = 4; の所で何かエラーが出て欲しかったのか?
ま、しかし、C言語は元々そんな生易しい言語ではないのだよ。
133:デフォルトの名無しさん
07/05/10 15:03:16
だろうな
しかしなんでコンパイラ通っちゃうのかよくわからん
134:デフォルトの名無しさん
07/05/10 15:04:13
そういうのでもコンパイルを通すように作られてるから
135:デフォルトの名無しさん
07/05/10 15:06:30
文法的には正しいから
136:デフォルトの名無しさん
07/05/10 15:13:46
>>117
JavaとかC#とかしかやったことが無い人?
137:デフォルトの名無しさん
07/05/10 15:19:34
>>133
エラー出すようにするとコンパイラ作るのが面倒だろ
138:デフォルトの名無しさん
07/05/10 15:24:15
なるほどw
先頭要素のポインタさえありゃ動くからあとはシラネってことか
139:デフォルトの名無しさん
07/05/10 15:59:43
仕様通り
140:デフォルトの名無しさん
07/05/10 15:59:53
indexに変数が入ってる場合に、その変数が取り得る値をチェックするには実行してみないと
わからないんじゃ?
141:デフォルトの名無しさん
07/05/10 16:01:47
これを応用(悪用?)した技もあったしな
構造体の最後の要素を [1] にして、使いたい配列の大きさ分大きめにallocして使う
いつからか 1 無くてもコンパイル通るようになってたっけな
142:デフォルトの名無しさん
07/05/10 16:18:20
JavaとかC#の配列だと境界チェックしてるから範囲外なら例外が投げられるけどCではそういうのが無いからね。
C#はLengthプロパティ使ってループ回す場合はチェックはオフになったり
monoのC#コンパイラには配列境界チェックをしないようにするオプションがあったりするけど
Cは常にチェック無し。
まぁチェックがある分安全で遅いか、無い分危険で速いかだな。Cは後者。
143:デフォルトの名無しさん
07/05/10 16:48:32
switchが上手く動作しないのですけれど、何処が可笑しいのか教えて下さい
/*
もし小文字なら大文字を、大文字なら小文字を出力し
エラーの後に再入力可否選択を要求する
*/
#include <stdio.h>
#include <ctype.h> // islowerやtoupperなどが含まれる
main () {
char text;
first:
printf ("アルファベットを入力して下さい\n");
text = getchar ();
// 大文字変換処理
if (islower(text)) { // islower = 小文字であるかを判定
text = toupper (text); // toupper = 大文字変換
printf ("入力されたアルファベットの大文字は %c です。"
,text);
} else if (isupper(text)) { // isupper = 大文字であるかを判定
144: ◆awSK7mC37A
07/05/10 16:49:33
// 小文字変換処理
text = tolower (text); // tolower = 小文字変換
printf ("入力されたアルファベットの小文字は %c です。"
,text);
} else {
// エラー処理
printf ("エラー\n"
"アルファベット以外の値が入力されました。"
"\n"
"継続して入力しますか?\n"
"Y/N");
text = getchar ();
145:デフォルトの名無しさん
07/05/10 16:50:09
switch (text) {
/*
switchが何故か機能しない
書式ミス?
*/
case 'Y': goto first;
break;
case 'N': goto end;
break;
}
}
end:
return 0;
}
>>144の名前は気にしないでください。。
146:デフォルトの名無しさん
07/05/10 16:59:12
switchの式って整数型に限られるんじゃ無かったっけ?
147:デフォルトの名無しさん
07/05/10 17:00:40
textはどう見ても整数型だろ
148:デフォルトの名無しさん
07/05/10 17:00:50
いや、別にこれでいいけど、2回目のgetchar() では最初のgetchar()時に
入力した2文字目を取ってきてるからこうなる。
具体的には改行だな。それ以外でも2つ以上入れてりゃ同じだ
149:デフォルトの名無しさん
07/05/10 17:51:56
alphabet以外の文字、たとえば 1 を入力してテストしてみると
swtich文に入って行かない。きっと1の後ろに"\0"とかあって
うまくゆかないのだろう。
text = getchar (); // ここで "\0" を喰わせる
text = getchar (); // きっと入力待ち状態になるはず
とか思ってしまったトーシローなのは俺だけでいいと思うんだ…orz
150:デフォルトの名無しさん
07/05/10 18:18:00
わざわざそんなこと書かなくてもいいよ
151:デフォルトの名無しさん
07/05/10 18:25:13
>>148
つまりどういうことですか?
152:デフォルトの名無しさん
07/05/10 18:36:47
>>151
つまり、余分な入力バッファはクリアする必要がある。
getchar() なら、'\n' が来るまで読み捨てるとか。
while (getchar() != '\n')
;
例えばこんな感じで。 fflush(stdin); は物議をかもしそうなのでお試しでw
あとは、switch - case にdefault: は必要だと思うぞ、特に今回のは。
153:デフォルトの名無しさん
07/05/10 19:35:06
>>151
scanf(" %c", ...) を使う。
154:デフォルトの名無しさん
07/05/10 19:38:20
goto の使い所がダメな感じするな。
goto 使って見辛くしてどうする。
お前は昔の BASIC かと言いたい。
155:デフォルトの名無しさん
07/05/10 19:48:39
どうでもいいけどgotoつかったらbreak;いらなくね?
156:デフォルトの名無しさん
07/05/10 19:55:41
いらないが付けるクセはつけといてもいいかも
あとそれ以前に慣れないうちはdefault付けるクセをつけといたほうがいいと思う
157:デフォルトの名無しさん
07/05/10 21:41:52
ANSI-Cを勉強してまだ日も浅いのですが
四則計算の 23 / 3 =7 アマリ 1
という風にアマリを出すにはどのようにすればいいのでしょうか?
158:デフォルトの名無しさん
07/05/10 21:42:09
mod
159:デフォルトの名無しさん
07/05/10 21:42:37
普通に%じゃあかんのか?
160:デフォルトの名無しさん
07/05/10 21:42:46
%dane
161:デフォルトの名無しさん
07/05/10 21:43:44
%d姉
162:デフォルトの名無しさん
07/05/10 21:46:32
〜〜省略〜〜
int a,b,c;
scanf("%d",&a);
scanf("%d",&b);
c= a % b ;
printf("%d % %d =%d\n",a,b,c);
return 0;
でいいのでしょうか?
163:デフォルトの名無しさん
07/05/10 21:47:58
だめ
164:デフォルトの名無しさん
07/05/10 21:48:10
> printf("%d % %d =%d\n",a,b,c);
printf("%d %% %d =%d\n",a,b,c);
165:デフォルトの名無しさん
07/05/10 21:51:08
あとbが0かどうかもチェックしたほうがいいな。
166:デフォルトの名無しさん
07/05/10 21:51:31
>>162
bが0の場合どうするんだ?
167:デフォルトの名無しさん
07/05/10 21:53:19
分岐か何かが必要なんですね、if 0〜〜とかそういう感じなんでしょうか
168:デフォルトの名無しさん
07/05/10 21:58:04
聞く前にとりあえずコード書いてコンパイルしてみろ。
169:デフォルトの名無しさん
07/05/10 22:05:35
if (*s && isalpha(*s)) {...}
が LinuxとSolarisで動作が違うのでgcc -Eで確認したらSolatisではisalpha(c)が
((__ctype+1)[c] & (0x01 | 0x02)) に展開されててLinuxではライブラリ関数呼んでました。
動作が違ったのは*sが負数になってたせいのようでした。(なぜ負のインデックスで__ctype配列
参照してcore吐かなかったか不思議ですが...)*sに入る整数値がなんでもありと
すると、ここは普通どう書きますか?
if (isascii(*s) && isalpha(*s)){...}
とかすればOK?
170:デフォルトの名無しさん
07/05/10 22:11:18
>>164
%% って \n とかのエスケープシーケンスと同じものと考えておkですか?
171:デフォルトの名無しさん
07/05/10 22:12:19
>>170
エスケープシーケンスで例えるなら \\ やね。
172:デフォルトの名無しさん
07/05/10 22:13:43
>>169
is系関数に渡すときは unsigned char でキャストするのは定石。
もう多すぎて面倒なら、char を符号無しにするコンパイラのフラグを指定汁。
173:デフォルトの名無しさん
07/05/10 22:29:09
UNIX環境でCを書いています。
FILE *fp
fp = popen("gnuplot", "w");
fprintf(fp, "plot sin(x) w lines \n");
pclose(fp);
としてgnuplotを呼び出すプログラムを作りました。
今の状態では、gnuplotが立ち上がってsin(x)の関数が一瞬だけ表示され、
gnuplotが直ちに終了してしまいます。
どこにどのような処理をすれば、gnuplotを表示させたままに出来るのでしょうか?
Enterキーなどを押すことで終了するようにしたいです。
よろしくおねがいします。
174:デフォルトの名無しさん
07/05/10 22:32:14
>>172
それだけだとSJIS の時は、
全角文字の2バイト目で真になる可能性があるな。
リードバイトの判定とかした方がいい。
>>169 は EUC みたいだから大丈夫だとは思うが。
175:デフォルトの名無しさん
07/05/10 22:48:20
>>173
system("gnuplot < data.txt");
とかじゃだめかな?
data.txtはあらかじめ作っておく。
176:デフォルトの名無しさん
07/05/10 22:49:27
>>172,174
ありがとうございます。m(_;_)m
>is系関数に渡すときは unsigned char でキャストするのは定石。
助かります。
177:デフォルトの名無しさん
07/05/10 23:27:12
>>173
とりあえず表示を残すだけなら "gnuplot -persist" とすれば良いけど、
グラフを表示しているプロセス(gnuplot_x11)のIDを
外部プログラムを使わずに見付けて殺す方法が分からん。
178:デフォルトの名無しさん
07/05/10 23:50:48
system("gnuplot ... &")ではダメ?
真面目にプロセス管理したいならfork()/exec*()を使う羽目になるけど。
179:デフォルトの名無しさん
07/05/11 06:20:36
初歩的な質問ですがお願いします。
strlenなどの文字列を扱う関数は引数としてchar型の文字列への先頭ポインタをとります。
つまり、strlen(s)とすると配列sの先頭アドレスが渡され、結果が返ります。
しかし、strlen("test")とした際も結果は出力されます。
この"test"という文字列はどのようにプログラム内部で扱われるのでしょうか?
自動的に一時的にメモリに確保されるのでしょうか?
では宜しくお願いします。
180:デフォルトの名無しさん
07/05/11 07:31:33
>>179
exeファイルの中に入ってるでしょ
実行時にどう配置されるかはシステムによる
プログラム上ではポインタとして扱われる
181:デフォルトの名無しさん
07/05/11 07:44:13
>>179
ほぼ、static const char foo[] = {'t', 'e', 's', 't', '\0', }; strlen(foo);と同じ。
182:デフォルトの名無しさん
07/05/11 15:35:08
クリリンのAAきぼん
183:183
07/05/11 20:29:09
↓のソースで、☆印の行は何か意味があるでしょうか。
あってもなくても変わらない気がするのですが...
( 環境:Windows Vista , Visual Studio C++ Express Edition )
#include <stdio.h>
#include <windows.h>
#define THREAD_NUM 4
#define DATA_NUM 12
typedef struct _thread_type {
int thread_no;
int *data;
CRITICAL_SECTION *cs;
} thread_arg_t;
void thread_func(void *arg) {
thread_arg_t* targ = (thread_arg_t *)arg;
int i, result;
for (i = 0; i < DATA_NUM; i++) {
// EnterCriticalSection(targ->cs);
result = targ->data[i] + 1;
Sleep(0); ☆
targ->data[i] = result;
// LeaveCriticalSection(targ->cs);
}
}
184:183
07/05/11 20:30:00
int main() {
HANDLE handle[THREAD_NUM];
thread_arg_t targ[THREAD_NUM];
int data[DATA_NUM];
int i;
CRITICAL_SECTION cs;
/* データの初期化 */
for (i = 0; i < DATA_NUM; i++) data[i] = 0;
InitializeCriticalSection(&cs);
for (i = 0; i < THREAD_NUM; i++) {
targ[i].thread_no = i;
targ[i].data = data;
targ[i].cs = &cs;
handle[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_func,
(void *)&targ[i], 0, NULL);
}
WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);
DeleteCriticalSection(&cs);
for (i = 0; i < DATA_NUM; i++) printf("data%d : %d\n", i, data[i]);
return 0;
}
あとSleepは、
・0ミリ(引数の分)秒ウェイト状態にする。
・0はMPUを他の優先度のスレッドにのみ譲る。
ということでしたよね?
185:デフォルトの名無しさん
07/05/11 20:30:46
>>183
Win32では 「0を指定した場合、 スレッドは、 実行準備ができている同じ優先順位のほかのスレッドにタイム スライスの残りを譲ります。」
186:デフォルトの名無しさん
07/05/11 20:39:55
なんでMSDN Libraryで調べれば直ぐ分かるような事を質問するんだろうな
187:183
07/05/11 20:40:06
>>185
おーありがとございますー!!
188:デフォルトの名無しさん
07/05/12 00:12:06
printf("%s/n","Hello World");
上のprintf文の%sでどのように"Hello World"を処理しているのか分かりません。
どなたかご教授して下さい。
189:デフォルトの名無しさん
07/05/12 00:14:46
意味が分からん。
190:デフォルトの名無しさん
07/05/12 00:15:28
>>188
マルチうざい
191:デフォルトの名無しさん
07/05/12 00:25:14
>>190
すみません
192:デフォルトの名無しさん
07/05/12 00:33:48
>>190
ごめんなさい、でも教えてください蟹
Viiv
ミ(エ)ミ....
193:デフォルトの名無しさん
07/05/12 00:35:48
あのーコールバックの書き方が解からないのですが
助けてください。動作するサンプル提示してくれませんか?
194:デフォルトの名無しさん
07/05/12 00:37:14
何のコールバックだよ…
195:デフォルトの名無しさん
07/05/12 00:37:38
URLリンク(www.google.co.jp)
196:蟹NIC
07/05/12 00:37:47
printf("%p/n","Hello World");
上のprintf文の%pでどのように"Hello World"を処理しているのか分かりません。
どなたか教えてください。
Viiv
ミ(エ)ミ....
197:デフォルトの名無しさん
07/05/12 00:49:14
>>188
可変長引数でも調べて推測してください。
様は第一引数の中を読んでいって、%フラグに当たったら対応する引数をフラグに従って変換した上で元の文字列に挿入してるんだと思う。
198:デフォルトの名無しさん
07/05/12 00:56:33
別に挿入なんかしてないけどね。
199:デフォルトの名無しさん
07/05/12 01:55:15
>>197
ご教授ありがとうございます。
200:デフォルトの名無しさん
07/05/12 02:30:45
そんなに知りたいならglibcのソースでも読めばいいのにな
201:デフォルトの名無しさん
07/05/12 02:37:18
ソースリーディングは初心者には難しい
202:デフォルトの名無しさん
07/05/12 02:45:10
>>196
------------------------------------------------------------
60 名前: デフォルトの名無しさん 投稿日: 2007/05/12(土) 00:10:17
printf("%s/n","Hello World");
上のprintf文の%sでどのように"Hello World"を処理しているのか分かりません。
どなたかご教授して下さい。
------------------------------------------------------------
この質問って流行ってるのか?
203:デフォルトの名無しさん
07/05/12 02:49:12
馬鹿がマルチしてるだけじゃない?
204:蟹NIC
07/05/12 03:16:31
>>202 いいえ、まマイブームレベル位かな
Viiv
ミ(エ)ミ....
205:デフォルトの名無しさん
07/05/12 06:53:20
>>117
配列は番兵を使うために便宜的に要素+1の部分にアクセスできるんだぜ?
206:デフォルトの名無しさん
07/05/12 07:27:03
>>205
ねーよwwwwwwwwwwwwwwwwwwwwwwwwwww
#include <stdio.h>
int main() {
int a[4] = { 0, 0, 0, 0 };
int b = 0;
a[4] = 3;
printf("%d\n", b);
return 0;
}
で 3 が表示されたぜ(gcc 4.0.1 for Mac)。
207:デフォルトの名無しさん
07/05/12 07:33:50
ポインタを向けるだけなら未定義動作にならないってだけでしょ
208:デフォルトの名無しさん
07/05/12 07:43:23
>アクセスできる
をどう好意的に解釈しても、ポインタを向けるだけ、にはならん罠。
209:デフォルトの名無しさん
07/05/12 07:45:46
どちらかというと205宛てに書いたレスなのだが…
210:デフォルトの名無しさん
07/05/12 08:50:05
>>205
>配列は番兵を使うために便宜的に要素+1の部分にアクセスできるんだぜ?
マジレスするとそれは文字列のときだけな。
char a[] = {1, 2, 3}; // sizeof a == 3
char b[] = "123"; // sizeof b == 4
211:デフォルトの名無しさん
07/05/12 08:50:21
釣りだって
212:デフォルトの名無しさん
07/05/12 08:51:17
知ってるよ
213:デフォルトの名無しさん
07/05/12 08:52:22
char c[3] = "123";
214:デフォルトの名無しさん
07/05/12 09:00:47
charの配列だけchar配列じゃなくて文字配列って言うことが多いし
文字配列には後ろに'\0'が付くみたいな覚え方をしてたから
なんかcharの配列だけは特別な代物のように思ってた過去
215:デフォルトの名無しさん
07/05/12 09:01:56
文字配列とは言わんなあ。
文字列としか。
216:デフォルトの名無しさん
07/05/12 11:26:20
私の処で文字配列といった場合、それはナルターミネートされていない。
217:デフォルトの名無しさん
07/05/12 11:35:24
相変わらず嘘と無価値な雑談でしか伸びないスレだな
218:デフォルトの名無しさん
07/05/12 11:36:38
君も仲間だ、歓迎するよ
219:デフォルトの名無しさん
07/05/12 13:01:15
質問です。
#include <stdio.h>
int main(void)
{
float a,b;
char e;
printf("変数a=");
scanf("%f",&a);
printf("変数b=");
scanf("%f",&b);
printf("文字=");
scanf("%c",&e);
printf("変数a=%f 変数b=%f 文字列d=%c\n",a,b,e);
return 0;
}
これをコンパイルすると文字列データを読みこんでくれません。。
おそらくprintfかscanfの仕様に問題があるのでしょうがこれの理由と回避方法をご教示願いたいです。
220:デフォルトの名無しさん
07/05/12 13:17:40
>>219
・文字と文字列の違いを理解しよう。
・scanf()の仕様に気をつけよう。
221:デフォルトの名無しさん
07/05/12 13:20:11
演算子を使わないで割り算や掛け算ってどうやるんですか?たとえば9÷3
222:デフォルトの名無しさん
07/05/12 13:22:43
演算子を使わないで演算するには、関数を使えばいい。
223:デフォルトの名無しさん
07/05/12 13:25:01
>>222
関数を自分でつくるということですかね?
224:デフォルトの名無しさん
07/05/12 13:25:16
>>219
scanf("%c",&e);
↓
scanf("%*[ \t\n]");
scanf("%c",&e);
変数b を読み込んだ後、改行文字がバッファに残っている
バッファに残った改行文字を次の scanf("%c",&e); で読み込んだため
変数e には改行文字が入ってしまった
この問題を回避するには、バッファに残っている改行文字を読み飛ばせば良い
225:デフォルトの名無しさん
07/05/12 13:27:18
つか入門書安易にscanf使いすぎ。
エラーチェックしなさすぎ。
226:デフォルトの名無しさん
07/05/12 13:38:59
>>223
つ[div()]
227:デフォルトの名無しさん
07/05/12 13:54:31
>>224なるほど ありがとうございます。
228:デフォルトの名無しさん
07/05/12 14:22:00
>>222
数学を一度勉強した方がいいですね。
具体的には線形空間というやつですよ・・・
229:デフォルトの名無しさん
07/05/12 14:27:06
数学の話じゃないだろ・・・常識的に考えて。
230:デフォルトの名無しさん
07/05/12 14:27:32
>>228
演算子を使わずにできる?
もちろんシフト演算も無しで
>>221
関数以外だとインラインアセンブラ使えば
演算子を使ったとは言われないとか?
231:デフォルトの名無しさん
07/05/12 14:28:43
>>228
何を寝惚けたことを?
232:デフォルトの名無しさん
07/05/12 14:44:24
設問の定義があいまい
233:デフォルトの名無しさん
07/05/12 14:51:20
// 演算子を使わない足し算。
int add(int a, int b)
{
FILE * fp = fopen("/dev/null", "w");
int rtn = fprintf("%*s%*s", a, "", b, "");
fclose(fp);
return rtn;
}
234:デフォルトの名無しさん
07/05/12 14:52:56
>>233
負数対応キボン
235:デフォルトの名無しさん
07/05/12 14:57:17
>>233
代入演算子を使っているw
>>234
わはは、そりゃ確かに>233じゃ無理だ。
236:デフォルトの名無しさん
07/05/12 14:58:03
int add(int a, int b) {
}
237:デフォルトの名無しさん
07/05/12 14:58:57
ミスった。
int add(int a, int b) {
__asm {
mov eax, a
add eax, b
}
}
238:デフォルトの名無しさん
07/05/12 15:02:00
そういえば関数呼び出しの括弧も演算子なんじゃなかったっけ?
239:デフォルトの名無しさん
07/05/12 15:02:17
>>222がなんでそんなことをしたくて何を「演算子」と呼んでいるかしらんが
if文だりなんだり使って全部作ればいいんじゃね
足し算なら1+1 = 2
だからa,bが両方とも1なら2を出力するというように
それらをすべて0〜9のを自分でつくる
あと桁上げの関数ももちろん自分で作って
240:デフォルトの名無しさん
07/05/12 15:03:27
比較にも演算子が必要だな。
241:デフォルトの名無しさん
07/05/12 15:04:40
if じゃなくて switch ならイケる。
ただ、コード量が多すぎて int 全部を網羅できないな。
char 程度ならともかく。
242:デフォルトの名無しさん
07/05/12 15:05:01
switch しか無いな
243:デフォルトの名無しさん
07/05/12 15:05:06
つまんないからもうやめていいよ
244:デフォルトの名無しさん
07/05/12 15:07:01
お前らほんと数学分かってないんだな・・・
まじ小学校からやり直せよ
245:デフォルトの名無しさん
07/05/12 15:08:19
>>235
そこにある=は初期化子であって演算子ではない。
246:デフォルトの名無しさん
07/05/12 15:12:47
>>244
プログラミング言語において「演算子」が何を指すかを勉強し直してきてください。
247:デフォルトの名無しさん
07/05/12 15:13:17
>>241
桁上げの関数作ればできるだろ
switchだって演算子を裏に隠しているだけに過ぎないし
ちなみに足し算とかってそもそも写像なんだから
なんでそんなことやりたいのかよくわからん
数学じゃなくてC言語で言う「演算子」は人間が勝手に付けた分類だから
それにこだわっても意味が無い
>>228のいうように少し数学を学んだほうがいい
248:デフォルトの名無しさん
07/05/12 15:13:39
>>245
しかし残念 >>238
249:デフォルトの名無しさん
07/05/12 15:15:31
>>247
何で数学の演算子にこだわるのか理解できないのだが。
ここは C 言語スレだぞ?
250:デフォルトの名無しさん
07/05/12 15:18:44
元質問者出てこいよ
後出しで、四則演算子のことでした、とか言いそうだが
251:デフォルトの名無しさん
07/05/12 15:19:36
>>222-250
252:デフォルトの名無しさん
07/05/12 15:20:53
>>221
>演算子を使わないで割り算や掛け算ってどうやるんですか?たとえば9÷3
割り算や掛け算って言ってるけど
253:デフォルトの名無しさん
07/05/12 15:22:43
>>222の問題意識が何なのかということだぁね
C言語だと同じことできるけどこれは演算子と呼ぶ
これはそう呼ばないだけの違いになってしまうから
C言語での「演算子」の意味にこだわって
わざわざ考えるほどの価値がある物と思えない
もし>>222がC言語において何を演算子と呼ぶのかをどうやって決めたか
知りたいとかなら別だけど
結局のところC言語での演算子と数学での演算子の区別すらつかずに
質問しちゃったってオチの気がするw
254:デフォルトの名無しさん
07/05/12 15:24:37
C仕様書には区切り句で何らかの作用を起こすもの(代入とかな)を演算子とすると書かれてるんだから
演算子を使わずに何かをするなんて無理だろ
255:デフォルトの名無しさん
07/05/12 15:27:00
ここは環境依存おkだから、
インラインアセンブラ使えばおk。
256:デフォルトの名無しさん
07/05/12 15:30:17
2で割った剰余を取る演算て最近のコンパイラだと
勝手に0x01とのビットANDもしくはそれより速いコードに変えてくれるんでしょうか?
257:デフォルトの名無しさん
07/05/12 15:32:47
>>254
てことはC言語の演算子は数学の演算子の定義に沿って定義されている
ということだな べんきょうになったw
258:デフォルトの名無しさん
07/05/12 15:33:27
>>256
Yes.
259:デフォルトの名無しさん
07/05/12 15:36:31
sizeof まで演算子だしなあ。
260:デフォルトの名無しさん
07/05/12 16:02:59
(void)printf("ほげほげ");
と、printfまでキャストをする必要はあるのでしょうか?
261:デフォルトの名無しさん
07/05/12 16:04:21
>>260
無い。そもそもintをvoidにキャストしてどうするんだ?
262:デフォルトの名無しさん
07/05/12 16:04:27
>>260
ない。
ただし、戻り値を取得し忘れてるわけじゃなく明示的に捨ててるんだという意思表示として
(void)にする流儀はあるにはある。
好み、コーディングスタイルレベルの話。
263:デフォルトの名無しさん
07/05/12 16:05:26
>>261
戻り値を使わないことを明示する効果がある。
lintのようなチェッカを黙らせる効果もあるな。
264:デフォルトの名無しさん
07/05/12 16:06:37
そうそう、コーディング規約に「戻り値は必ずチェックすること」という項目があって、
それの評価を厳密に行なう運用の場合にもそうする必要があるね。
265:デフォルトの名無しさん
07/05/12 16:10:14
>>263
lint対策か。それなら納得
266:デフォルトの名無しさん
07/05/12 16:57:40
コンパイラにもよる。
たとえばFreescaleのCodeWarriorは(void)をつけないとwarningを出すのがデフォルト動作。
267:デフォルトの名無しさん
07/05/12 18:42:50
int main(void){
int a=1;
kansu(a);
}
までやっておいて
@int kansu(int a){
printf("%d",a*2);
}
Aint kansu(int *a){
printf("%d",a*2);
}
@だと正常に動いたのですが、
Aだと「*」がダメだ〜 とコンパイラに怒られるのですが、
この違いとは何なんでしょうか?
268:デフォルトの名無しさん
07/05/12 18:45:51
>>267
(2)の*は、意味も分からないで適当につけたの?
269:デフォルトの名無しさん
07/05/12 18:47:47
int kansu(int *a){
printf("%d",a*2);
}
↓
printf("%d",*a*2);
↑
これじゃね?
270:デフォルトの名無しさん
07/05/12 18:50:45
gets()関数で文章を読み取ってます。リダイレクションでメモ帳で作った文章入れると、改行のところ以降プログラムに読み込まれません。
どうしてでしょうか?改行があっても最後までいきたいんですが
271:デフォルトの名無しさん
07/05/12 18:52:22
>>270
getsは改行文字までしか読み取らない
manにも書かれてる基本仕様
ついでにgetsを使うのは推奨されない
272:デフォルトの名無しさん
07/05/12 18:53:05
>>271
じゃあ代理のものとして、何を使ったらいいですかね
273:デフォルトの名無しさん
07/05/12 18:54:58
>>268
気のせいかもしれませんが、
関数を定義してるプログラムを見ると多くが *a となっていたので、
違いを知りたいなと思って作ったプログラムなので、
かなり不備はあるかもしれません・・・。
>>269
Aの場合だと必ずメモリ関連でセグメントエラーか、警告が出続けてしまうんです。
試したところ、、、セグメントエラーが出ました。
274:デフォルトの名無しさん
07/05/12 18:56:55
>>272
fgets(・・・, stdin)
275:デフォルトの名無しさん
07/05/12 18:58:02
>>274
stdinっていうのはなんでしょうか
276:デフォルトの名無しさん
07/05/12 18:59:01
>>272
>gets() を使うのは極めて危険である。(中略)代わりに fgets() を使うこと。
URLリンク(www.linux.or.jp)
これぐらい自分で調べろ
277:デフォルトの名無しさん
07/05/12 18:59:34
>>273
コールするほうも
kansu(&a);
と変えないとだめだよ。
こういうところで試行錯誤してるなら、入門書を一冊買ったほうがだいぶ時間の節約になると思うけど。
278:デフォルトの名無しさん
07/05/12 19:00:09
>>275
とりあえずググれや。
279:デフォルトの名無しさん
07/05/12 19:00:11
>>273
int kansu(int *a) にするなら
int main(void){
int a=1;
kansu(&a); < &をつけなきゃ
}
280:デフォルトの名無しさん
07/05/12 19:01:56
>>276
危険なんですね。
fgetsにしたら
呼び出し時のパラメータが足りない:fgets(関数 main )
ってなってコンパイルできないんですが・・・・
281:デフォルトの名無しさん
07/05/12 19:02:58
>>280
URLリンク(www.bohyoh.com)
ちゃんと必要な引数を与えている?
282:デフォルトの名無しさん
07/05/12 19:04:35
>>277,279
すごい納得できました。ありがとうございました。
入門書は・・・買ったんですが、、、馬鹿なので理解できない^^;
283:デフォルトの名無しさん
07/05/12 19:06:16
>>281
なんかよくわからないんですが、
char型の配列に文章をいれたいんです・・・・
char bunsyo[256]
みたいなやつにです
284:デフォルトの名無しさん
07/05/12 19:07:28
>>283
fgets(bunsyo, 255, stdin)
285:デフォルトの名無しさん
07/05/12 19:08:16
>>283
gets()をfgets()に変更するくらいの手続きを自分で考えられない(≒検索できない)なら、
プログラマに向かないからとっとと諦めた方がいいよ。
286:デフォルトの名無しさん
07/05/12 19:09:04
>>284
ダウト。慣用句的にそれを使っているのなら、
一度マニュアルページをよく読んで自分の過ちに気付いておいた方がいい。
287:デフォルトの名無しさん
07/05/12 19:09:56
>>284
コンパイルはとおるんですが、改行のところで読み込みがおわってしまうんですが・・・・
288:デフォルトの名無しさん
07/05/12 19:10:09
>>284
第二引数Nはバッファサイズだろ
読み込まれる文字数最大値はN-1
289:デフォルトの名無しさん
07/05/12 19:10:27
>>286
ダウト。説明なしにそういうことを言うのはお前の知ったかに過ぎない
290:デフォルトの名無しさん
07/05/12 19:11:12
>>287
fgets()も、改行までしか読まない。
だから、マニュアルページを読むなり情報を検索できないなら無駄だから諦めろって。
291:デフォルトの名無しさん
07/05/12 19:11:56
>>288
gdgdいってねーで正解を書いたら?知ったかへぼプログラマーwwww
N-1そうだよ?何か?まさか、254 にしろとかボケないだろうね?
292:デフォルトの名無しさん
07/05/12 19:12:48
>>290
読み込むテキストに工夫がいりますかね?
293:デフォルトの名無しさん
07/05/12 19:13:06
>>289=>>291か?
ファビョってんじゃないよ。
そこまで分かってて正解が判らないような屑がこの板なんかに書くんじゃないよ。
294:本日の知ったか馬鹿第一号
07/05/12 19:13:27
288 名前:デフォルトの名無しさん 投稿日:2007/05/12(土) 19:10:09
>>284
第二引数Nはバッファサイズだろ
読み込まれる文字数最大値はN-1
295:デフォルトの名無しさん
07/05/12 19:13:42
暇だからプログラム組もうかな
でも、モチベーションが・・・・・
なにか練習問題でものってるサイトないか?
296:デフォルトの名無しさん
07/05/12 19:14:33
>>292
テキストファイルを丸ごと読み込むには、
・fgetc()で一文字ずつ
・fgets()で一行単位で
・fread()でブロック単位(或いは一気に)
読む必要がある。
297:デフォルトの名無しさん
07/05/12 19:14:34
>>291
だから>>283の宣言なら、普通にfgets(bunsyo, 256, stdin);でいいだろ
なんでバッファのラスト1バイトを無駄にしてんだよ
>>292
ループ回して一行ずつ読み込む
298:デフォルトの名無しさん
07/05/12 19:14:44
>>287
宿題スレで、ファイル全部読み込むコード書いてくださいって言ったほうがいいんじゃね?
299:デフォルトの名無しさん
07/05/12 19:14:47
>>276とかこのスレにいらねーだろ。このスレが何なのかわかっていないのに
まだ勉強中の知らない奴を見つけて、自分が知っていることをひそかに自慢しながら
他人をたたく基地外だろ。ここでレスしているほかの奴にとっては迷惑千万、失せろクズプログラマー
300:デフォルトの名無しさん
07/05/12 19:15:52
>>293
>そこまで分かってて正解が判らないような屑が
自分が指摘したのに答えられない(勘違い)クズこそ来るなよw
お前はまったく指摘をしていない。ただたんに 自分が思った ことと違っていただけ。
それもお前が間違えているという勘違い(プ
不適切なら正しい使い方を明示しろ、たぶんお前じゃできない。あれは間違っていないからw
301:デフォルトの名無しさん
07/05/12 19:15:56
ファイルのサイズがわかってるなら、適当な大きさのバッファを用意して、
fread()でもいいけどな。
302:デフォルトの名無しさん
07/05/12 19:16:07
人間の屑よりはマシだな
303:デフォルトの名無しさん
07/05/12 19:16:58
>>296
うーん。めんどくさそうですね。テキストファイルの改行をなくしちゃいます
304:デフォルトの名無しさん
07/05/12 19:17:35
>>300
あのね、坊やみたいなお子ちゃまはこんなところに来ちゃダメよ。
既に正解レスがついているんだからもっと落ち着きましょうね。
305:デフォルトの名無しさん
07/05/12 19:18:10
お前ら邪魔
306:デフォルトの名無しさん
07/05/12 19:18:18
>>299
自分で考えよう、調べようって姿勢が見えたら、頭わるそうなヤツでもけっこう親切に教えてもらえるよ。
ただ「わからない、を即答せよ」ってだけじゃ教えてもらえない。
307:デフォルトの名無しさん
07/05/12 19:19:32
>>293
揚げ足取りにもならなかったな、所詮お前はわかっていない(っと自分が思った)奴をたたくだけか
二度とくるな、お前みたいなクズこそこのスレにはいらない。このスレのタイトル読めますか?
あっ、日本語も日本の社会もろくに知らない在日かw
308:デフォルトの名無しさん
07/05/12 19:20:15
まぁ、fgets()の慣用句はfgets(buf, sizeof(buf), stdin)だがな。
仮にもプログラムを組もうというときに、きちんと調べる手間を惜しんじゃ遺憾な。
309:デフォルトの名無しさん
07/05/12 19:20:18
以下、キモメンメガネデヴピッツァのきめ台詞が出るまでお待ちください
310:デフォルトの名無しさん
07/05/12 19:20:38
>>304
あのね、小学生未満の精神年齢のお子ちゃまはこんなところに来ちゃダメよ。
勘違いの指摘レスがついているんだからもっと落ち着きましょうね♪
んで、何が間違いか、指摘できた?正解がとかじゃなくてw
311:デフォルトの名無しさん
07/05/12 19:21:38
「屑」対「クズ」か。どっちが半島人かは火(病)を見るより明らかだな。
312:デフォルトの名無しさん
07/05/12 19:22:26
>>284は単なる入力ミスだろ。それだけでここまで お前はあほだ! みたいな
プレッシャーをかける基地外ってプログラマーに向いてねーよなwwwwww
313:デフォルトの名無しさん
07/05/12 19:22:47
>>309
半島人がでてきたぞ。
314:デフォルトの名無しさん
07/05/12 19:23:23
>>282
だったらその本は自分に向いていなかったと諦めて、
ちょっと立ち読みして、ほかに良さそうな本を探して買えばいい。
315:デフォルトの名無しさん
07/05/12 19:23:36
くずはくずかごに入っとけ。
それより早く>>295に答えてください。
316:デフォルトの名無しさん
07/05/12 19:24:33
>>311 地球上のカス以下の お 前 が 言 う な wwwwwwww
っつーか、揚げ足取り必死だなw
そんなんじゃ本当にプログラマーに向いてねーよ、その程度のことでガミガミ
相手を罵倒するようじゃ、そんな奴こそこんなスレに来ないほうが良いだろ。
気分が悪くなるものを敢えてみてゲロを吐いているマゾかい?w
グロ動画でも貼ってやろうか?w
317:デフォルトの名無しさん
07/05/12 19:24:59
おお、新展開。今度の攻撃は「単なる入力ミス」ですw
>>315
宿題スレに未解決の宿題が幾つかあるんじゃない?
下手なサイト見るより勉強になりそうですよ。
318:デフォルトの名無しさん
07/05/12 19:29:25
freadでも使えば。
319:デフォルトの名無しさん
07/05/12 19:30:13
>>317
ほらな、そういうことで相手をチクチクつついて周りの気分も害しているだろ?
だからお前みたいなつまらねークズはプログラマーに向いてないから
頼むから大掛かりなプロジェクトには絶対に介入するなよ。
っつーか協調性がなくて無理だろうね、お前みたいなちっぽけなクズはw
ちなみに、あの程度の間違いならさらっと 256 って書けば済んだ話だろ。
お前わかってねー!間違えたへへーん馬鹿!とか罵倒する方が頭がイカレてんだろ。
そういう奴に限って、自分の間違いを指摘されると、認めないどころか
お前がおかしい!って言い始めるから困るぜ ヤレヤレ
以後、さっきからきんもぉ〜★な指摘するだけで答えを出さない基地外は放置よろ
たぶん引きこもりニートだろ
320:デフォルトの名無しさん
07/05/12 19:30:36
>>318
>296
>301
321:こいつさいこーに協調性のない引きこもりwww
07/05/12 19:32:14
317 名前:デフォルトの名無しさん 投稿日:2007/05/12(土) 19:24:59
おお、新展開。今度の攻撃は「単なる入力ミス」ですw
293 名前:デフォルトの名無しさん 投稿日:2007/05/12(土) 19:13:06
>>289=>>291か?
ファビョってんじゃないよ。
そこまで分かってて正解が判らないような屑がこの板なんかに書くんじゃないよ。
297 名前:デフォルトの名無しさん 投稿日:2007/05/12(土) 19:14:34
>>291
だから>>283の宣言なら、普通にfgets(bunsyo, 256, stdin);でいいだろ
なんでバッファのラスト1バイトを無駄にしてんだよ
なんでバッファのラスト1バイトを無駄にしてんだよ
↑こういう嫌らしい言い方をするだろ?
だから日ごろ嫌われていることに気づかない仲間はずれなんだろうからこんな場所で
匿名性を利用して自分より知識の乏しい弱者相手に強気になれるんだろうねw
322:284
07/05/12 19:34:14
>>284はただの入力ミスです ♠
56としたつもりが同じキーを2回押して書き込みしちゃっただけでぇ〜〜〜す ♣
あぁ〜〜いとぅいまてぇ〜〜ん、文字配列のサイズを指定するように、ここでレスする以外の
自分が書くソースでは sizeof 使ってまぁ〜〜〜つ ♥
323:デフォルトの名無しさん
07/05/12 19:36:19
char s[256];
size_t size=sizeof(s)/sizeof(s[0];
sizeof(s,size,stdin);
こんな感じでぇ〜〜どぉ〜〜〜でちゅかぁ〜〜?♦
324:デフォルトの名無しさん
07/05/12 19:37:15
あちゃぁ〜〜、今度はsizeofの閉じ括弧忘れちゃいまちちゃぁ〜〜〜
あぁ〜〜〜いとぅいまちぇぇ〜〜〜〜ん ♪
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5230日前に更新/240 KB
担当:undef