C言語なら俺に聞け( ..
[2ch|▼Menu]
44:18
07/06/26 08:44:31
寝てしまった。。
答えてくれた方、申し訳ない&thx!

そ し て
問題点分かりました!
>>26の言うとおり、配列の要素が-になるのを回避、x,yを0で初期化したら
直りました!初期化しておかないと駄目なんだな!

あと、srandはとりあえずmainでやっておきます!


45:デフォルトの名無しさん
07/06/26 08:54:36
既に>20で指摘されている罠。

46:18
07/06/26 09:44:16
そこは、>>20で変更したんですが、(case8が出来てないけど)
問題は、x,yの初期化という事です。


47:デフォルトの名無しさん
07/06/26 09:56:00
VisualC++ExpressEditionを使ってるんですが、
#include <stdio.h>

main()
{
    printf("私の名前は、山本一郎です\n");
}
(名前はrei1_2)というプログラムをビルドすると、
------ ビルド開始: プロジェクト: START_C, 構成: Debug Win32 ------
コンパイルしています...
rei1_2.c
リンクしています...
rei1_2.obj : error LNK2005: _main は既に rei1_1.obj で定義されています。
C:\Users\tokimaru\Documents\Visual Studio 2005\Projects\C\START_C\Debug\START_C.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
ビルドログは "file://c:\Users\tokimaru\Documents\Visual Studio 2005\Projects\C\START_C\START_C\Debug\BuildLog.htm" に保存されました。
START_C - エラー 2、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
というエラーが出てしまいます。
何所がおかしいのかよくわかりません。
教えてください。お願いします。

48:デフォルトの名無しさん
07/06/26 10:01:52
>>47
> _main は既に rei1_1.obj で定義されています
そりゃだめだ。リンクさせないで別物のソースとしてコンパイルせい

49:デフォルトの名無しさん
07/06/26 10:05:32
rei1_1.c をどっか別の所に移動するか、
新しくプロジェクトを作るか。

50:デフォルトの名無しさん
07/06/26 10:15:37
1を消さないんだったら同じソリューションで別プロジェクト作るのがいいかな

51:47
07/06/26 10:17:04
C:\Users\tokimaru\Documents\
って貼っちゃいましたけど、この情報から個人情報が割れたり、PCに侵入されたりしませんよね?

52:デフォルトの名無しさん
07/06/26 10:28:02
IP 分かんないから侵入とかは大丈夫だとは思うけど、あまり貼るべきではないな。

53:デフォルトの名無しさん
07/06/26 10:34:14
>>52よかった〜(汗)
ところで、48さん、49さん、50さんの言うようなやり方以外の方法ありますかね?
僕は初心者なのでよくわかりません。

54:デフォルトの名無しさん
07/06/26 10:39:48
>>53
だから他と被らない関数名にすりゃええやろ。

55:デフォルトの名無しさん
07/06/26 10:45:34
>>53
じゃあいったんプロジェクトから1を外せ
選択してDELキーで消える
ファイルそのものは残るから、あとで既存の追加で戻せる

56:デフォルトの名無しさん
07/06/26 10:49:36
>>54さん、>>55さんありがとうございました。

57:デフォルトの名無しさん
07/06/26 11:18:18
typedef struct node* link;
struct node { int item; link next; };
typedef link Node;

link deleteNext(link x){
link t = x->next; x->next = t->next;
return t; }


link t=x->next;
新たなlink tを作り、tにxの指し示すリンクと同じitem,リンク先を持たせている

x->next = t->next;
xのリンク先はtが指し示すリンク先にする

で合ってますか?
だとしたらreturnでtだけ返すのだからx->nextを指定しても何の意味もないと思うのですが、何か記号の意味を履き違えている気がします

58:デフォルトの名無しさん
07/06/26 11:36:45
malloc も free もないんだが。
恐ろしいコードに見える。

59:デフォルトの名無しさん
07/06/26 11:46:36
>>57
関数の動きはこんな感じ。

・xの指す先をtにコピー。xの指す先をtの指す先に変更。tを戻す。

つまり、リンクリストからxの指す先を外し、それを返している。

>>58
削除関数だからmalloc()は要らないわけだし、tを返すのは呼び出し元でfree()するためだろ。


60:デフォルトの名無しさん
07/06/26 11:48:24
>>57
link はポインタだから作るわけじゃないよ、アドレスを保存してるだけ。

A→B→C
の状態を
A→C
に変えてる
Bは宙に浮いてる状態で返してる。消すためだろう。

61:デフォルトの名無しさん
07/06/26 11:49:27
書き換えるとこうなるのか。
--
link t = x->next; // 削除対象(へのポインタ)を一旦保存
x->next = x->next->next; // 削除対象を迂回するように接続しなおし
return t; // 削除対象を返却

62:デフォルトの名無しさん
07/06/26 13:03:00
feof()はファイルの終わりをどこで判定してるんでしょうか?

例、ファイルの中身が
This is a pen

の場合は、nに達した時点で0を返すのか、EOFで0を返すのか


63:デフォルトの名無しさん
07/06/26 13:05:15
やれば分かる。

64:デフォルトの名無しさん
07/06/26 13:10:09
確かにこの程度なら実際に試してみるのが一番かもしれない

65:デフォルトの名無しさん
07/06/26 13:17:26
l = 0;
while(!feof(fp)){
ch = fgetc(fp);
printf("%c : %d \n",ch,ch);
if(ferror(fp)){
printf("ファイルの読み込みエラー\n");
exit(1);
}
l++;
}

を実行してみたら-1も出力したのでEOFの次でループ終了ですかね


66:デフォルトの名無しさん
07/06/26 13:27:09
おいおい

67:デフォルトの名無しさん
07/06/26 13:28:43
「EOF」 という言葉はどこを意図して使ってる?

68:デフォルトの名無しさん
07/06/26 13:29:31
-1じゃないんですか?


69:デフォルトの名無しさん
07/06/26 13:30:58
EOF を読み込んだら終了、だよね?

70:デフォルトの名無しさん
07/06/26 13:32:01
意図しようとしてるのは同じことなんだろうか?
ならいいんだけど。

71:デフォルトの名無しさん
07/06/26 13:32:23
EOFを読み込んだら終了ならEOFが出力されるのはおかしい


72:デフォルトの名無しさん
07/06/26 13:34:28
EOF を読み込んだら feof が真を返すようになるんだっしょ?

73:デフォルトの名無しさん
07/06/26 13:45:05
while(!feof(fp)) だからEOFに達した時点でループ終了してないとダメなんじゃないの?


74:デフォルトの名無しさん
07/06/26 13:46:16
EOF に達しはしたけど、読み込んではないよね?

75:デフォルトの名無しさん
07/06/26 13:46:58
何か二人で同じことを言おうとしてる気がしてならない。

76:デフォルトの名無しさん
07/06/26 13:47:06
実行すると-1返って来るよね
読み込んでるってことじゃないの?


77:デフォルトの名無しさん
07/06/26 13:48:29
とりあえずこんな感じだ。

#include <stdio.h>
#include <ctype.h>

int main() {
    int ch, b;
    FILE *fp = fopen("hoge.txt", "r");
    if(fp == NULL) {
        return 1;
    }
    do {
        ch = fgetc(fp);
        b = feof(fp);
        printf("%c : %02X / %d\n", ch, ch, b);
    } while(!b);
}

T : 54 / 0
h : 68 / 0
i : 69 / 0
s : 73 / 0
  : 20 / 0
i : 69 / 0
s : 73 / 0
  : 20 / 0
a : 61 / 0
  : 20 / 0
p : 70 / 0
e : 65 / 0
n : 6E / 0  ← n が読み込まれて、ファイルポインタは EOF に達しはしているが、まだ読み込んでないためそこが EOF かどうか分からないでいる
? : FFFFFFFF / 1  ← EOF が読み込まれたため、EOF に達した事が判明し、feof が真を返すようになる

78:デフォルトの名無しさん
07/06/26 13:50:58
>>76
-1 が返って来るのは、当然読み込んでるということ。
でも、その後にそれを表示してから、
その後にようやく feof をチェックしてるでしょ。
そっちのプログラムは。
で、そこでループが終了してる。
つまり、-1 が読み込まれた後に feof を実行すると
真を返すようになっている、ということだ。

79:デフォルトの名無しさん
07/06/26 14:01:32
fgetc()は、エラーとかファイルが終わってるとかで、読んだ文字がない時にEOFを返す。
「EOFを読み込んでいる」のではない。

80:デフォルトの名無しさん
07/06/26 14:03:01
「0 個のりんごがある」 と 「りんごが 1 個もない」 程度の話だよ、それは。

81:デフォルトの名無しさん
07/06/26 14:10:27
feofはファイルの末端に来ました
fgetcは読んだ文字がないので-1を返しました
feofは真を返しました

って話?


82:デフォルトの名無しさん
07/06/26 14:14:36
ファイルポインタは初めてファイルの末端に来ました
feofは偽を返しました
fgetcはもう読み込める文字がないので-1を返しました
feofは真を返しました

こうだな。

83:デフォルトの名無しさん
07/06/26 14:15:49
初めて、は余計か。

ファイルポインタはファイルの末端に移動してきました
feofは偽を返しました
fgetcはもう読み込める文字がないので -1 を返しました
feofは真を返しました

こうか?

84:デフォルトの名無しさん
07/06/26 14:20:15
while(fgetc(fp) != EOF)
の方がいいんじゃないの?


85:デフォルトの名無しさん
07/06/26 14:26:53
feof の挙動を調べたいみたいだよ。

86:デフォルトの名無しさん
07/06/26 14:27:59
1文字ずつ読んだ場合に加えて、いっぺんに読んだときどうなるかも調べてみては

87:デフォルトの名無しさん
07/06/26 14:30:54
>>84
それは趣旨が違うと思った
>feof()はファイルの終わりをどこで判定してるんでしょうか?

88:デフォルトの名無しさん
07/06/26 15:04:57
pthreadでデタッチスレッドを生成し、スレッドが終了した後に
仮想メモリが増えてしまいます。

#include <pthread.h>
#define THREAD_COUNT 50

void *thread_func(void *arg);

int main()
{
char command[128];
int i;
pthread_t thread[THREAD_COUNT];

sprintf(command, "grep VmSize /proc/%d/status", getpid());
for (i = 0; i < 3; i++) {
sleep(1);
system(command);
}
for (i = 0; i < THREAD_COUNT; i++) {
pthread_create(&thread[i], NULL, thread_func, &i);
pthread_detach(thread[i]);
}
for (i = 0; i < 10; i++) {
sleep(1);
system(command);
}
return 0;
}

89:88続き
07/06/26 15:06:07
void *thread_func(void *arg)
{
sleep(3);
}

が動かしたソースで、実行結果が↓こんな感じです。

VmSize: 1392 kB
VmSize: 1392 kB
VmSize: 1392 kB
VmSize: 410996 kB
VmSize: 410996 kB
VmSize: 42356 kB
VmSize: 42356 kB
VmSize: 42356 kB
VmSize: 42356 kB
VmSize: 42356 kB
VmSize: 42356 kB
VmSize: 42356 kB
VmSize: 42356 kB

90:88続き
07/06/26 15:10:54
色々調べたところ

410996kBは大体1392+8192kB×50(スレッド数)
42356kBは大体1392+8192kB×5

ぐらいになっているようでした。
8192kBはスタックサイズから来ているようで、スタックサイズを
変更してみたら仮想メモリサイズは変わりましたが、数式的には
上記と同じでした。

また、スレッド数を変えると410996kBのところがスレッド数に
応じた数に変わるのですが、最終的に落ち着く42356kBは
変わりませんでした。

増え続けることはないのでメモリリークとは違うと思うのですが
気にすることはないでしょうか。×5がどこから来ているのかとか
どうも気になってしまって・・・

何か分かりましたら教えてください。

91:88続き
07/06/26 15:11:47
すいません。ちなみに開発環境はRedHat 9.0、gcc 3.2.2です。

92:デフォルトの名無しさん
07/06/26 15:36:15
時間をずらして detach していった場合に
42356kB で止まるのだとしたら、
内部でいくつかの領域を確保したままにしてるのかも?
次にまた使うときのためにとか。

MacOSX 10.4.10 gcc 4.0.1 だと、
スレッド1つ分のサイズが残るみたいだ。

93:デフォルトの名無しさん
07/06/26 15:36:17
>>91
仮想メモリサイズの制限を越えたための拡張とかは?

94:88続き
07/06/26 15:49:52
>>92
色々観察してみると、同時に実行されるスレッド数が1つの場合、
1392kB+8192kB×1くらいになって、スレッドが終了しても
減りませんが、何度スレッドを起動してもこれ以上増えることは
ありません。

同時に実行されるスレッド数が5までの場合もこの傾向は同じ。
6を超えるとスレッド実行中の仮想メモリは増えるけど、スレッドが
終了すると5スレッド分の仮想メモリ量までは戻る、という
感じです。

5スレッド分は次回使いまわすために確保するようになってる
んでしょうかね。

>>93
ulimit -a で見たら、仮想メモリはunlimitedに設定されて
いました。

95:デフォルトの名無しさん
07/06/27 00:41:18
この脆弱性は文字列長の確認を適切に行わない strcpy()の呼び出しが原因
URLリンク(headlines.yahoo.co.jp)

96:デフォルトの名無しさん
07/06/27 00:50:55
>>95
あらら。

97:デフォルトの名無しさん
07/06/27 01:29:45
strcpyなんて使うなよ・・・

98:デフォルトの名無しさん
07/06/27 01:32:39
あっ、やっぱ問題があった、だから 使うなよ って後から言うのは卑怯。
さも知っていたかのようなことをいうやつに限って、そいつ自身が
ありきたりのタブーをやらかしていることがある。

99:デフォルトの名無しさん
07/06/27 01:34:17
いやいやせめてstrncpy使うだろ
昔から問題は指摘されてたんだしさ

100:デフォルトの名無しさん
07/06/27 01:39:42
単に文字列の整形ならsprintf()の方がいいと思う

101:デフォルトの名無しさん
07/06/27 02:10:14
ブラックジャック先生なら整形に失敗しないYO!

102:デフォルトの名無しさん
07/06/27 02:57:33
おいっ、おまいら、はよ1進数について議論せいや?どんな推論が出るかにゃ〜〜 ♥

103:デフォルトの名無しさん
07/06/27 03:11:34
wktk

104:デフォルトの名無しさん
07/06/27 03:12:03
実質0しか表現できないっしょ
数え始めた瞬間に桁上がりの無限ループ

105:デフォルトの名無しさん
07/06/27 04:07:08
>>104 それ、問題提起した俺が最初に提唱したぞな。それじゃ詰まらないからぁ
ここであらぬ妄想をぶっこく香具師らに推論させたいのよ ♠

106:デフォルトの名無しさん
07/06/27 04:14:33
おまいの提唱なんぞ知らんがな
>>102見てぱっと思ったから書いただけじゃ

107:デフォルトの名無しさん
07/06/27 04:15:34
>>106
スレリンク(tech板:966番)

108:デフォルトの名無しさん
07/06/27 08:26:21
Wikipediaに答があることをいつまでぐだぐだと……

109:デフォルトの名無しさん
07/06/27 08:29:36
それ以前にスレ違い。

110:デフォルトの名無しさん
07/06/27 09:41:24
気を使うのは外からの入力に対してであって
自分で作って自分で使うバッファは好きなの使えばいいと思う

111:デフォルトの名無しさん
07/06/27 10:00:38
>>98
>さも知っていたかのようなことをいう
知っててもおかしくはない…というより寧ろ、技術者としては知ってて当然。
君が無知だっただけ。

>>110
勿論。

112:デフォルトの名無しさん
07/06/27 10:12:48
>>111
> 君が無知だっただけ。
???>>98のどこをどう読んだら無知になるんだろうか?

113:デフォルトの名無しさん
07/06/27 10:22:34
>>108
Wikipedia項目リンク

114:デフォルトの名無しさん
07/06/27 10:52:54
>>98 なんて恥ずかしいセリフを言える時点で頭おかしい。

115:デフォルトの名無しさん
07/06/27 11:00:28
いや、恥ずかしいのは無知だとかありえない勘違いをしたこいつ↓
111 名前:デフォルトの名無しさん 投稿日:2007/06/27(水) 10:00:38
>>98
>さも知っていたかのようなことをいう
知っててもおかしくはない…というより寧ろ、技術者としては知ってて当然。
君が無知だっただけ。
知っててもおかしくはない…というより寧ろ、技術者としては知ってて当然。
君が無知だっただけ。
知っててもおかしくはない…というより寧ろ、技術者としては知ってて当然。
君が無知だっただけ。
知っててもおかしくはない…というより寧ろ、技術者としては知ってて当然。
君が無知だっただけ。
知っててもおかしくはない…というより寧ろ、技術者としては知ってて当然。
君が無知だっただけ。
知っててもおかしくはない…というより寧ろ、技術者としては知ってて当然。
君が無知だっただけ。

116:デフォルトの名無しさん
07/06/27 11:02:10
技術者としては知ってて当然。  技術者としては知ってて当然。  技術者としては知ってて当然。  
技術者としては知ってて当然。  技術者としては知ってて当然。  技術者としては知ってて当然。  
技術者としては知ってて当然。  技術者としては知ってて当然。  技術者としては知ってて当然。  

strcpyの問題点を知っているだけで技術者気取りになれる新米プログラマに失笑です ><;
ちなみに、そんなこと俺も当然知ってたけど、なんで俺が無知になるわけ?w
Lhacaにそれが使われていたなんて、俺は知らなかったけど、strcpyくらい当然知ってましたよ ( ^ー^)b

117:デフォルトの名無しさん
07/06/27 11:03:56
キチガイはすぐ暴れるから困る。

118:デフォルトの名無しさん
07/06/27 11:04:24
111 名前:デフォルトの名無しさん 投稿日:2007/06/27(水) 10:00:38

>>110
勿論。

↑おいおい、すでに問題としてあげられたのに、何知ったかぶっこいて同意してんの?(苦笑)
>>111 ←こいつ最高に知ったかのアホだな。恥ずかしい。プログラマなんてやめた方が良いぞ?
人生の大半を無駄にして終わるぞ?

119:デフォルトの名無しさん
07/06/27 11:17:59
勘違い野郎こそ知ったかぶるから困る。何これ?痛すぎ、必死すぎ
>>97 = >>99 = >>111 < こういう奴が三流プログラマになって世にあらぬ
欠陥品を流通させちゃうんだよね。で、後でアップデートパッチでサポート。
サポートしてんだからちゃんと仕事してますよって間違ったアピールをして
ユーザが離れていって廃れるソフトウェア会社勤務乙。

120:デフォルトの名無しさん
07/06/27 11:35:03
>>119
>痛すぎ、必死すぎ

121:デフォルトの名無しさん
07/06/27 11:50:47
URLエンコードってどうやるんですか?

122:デフォルトの名無しさん
07/06/27 12:10:24
C勉強したいと先輩に言ったらC♯勉強しろと言われたんですが、
CとC++とC#ってどんな違いがあるんでしょうか?

123:デフォルトの名無しさん
07/06/27 12:28:23
なんでその時に先輩に直接聞かなかったの?

124:デフォルトの名無しさん
07/06/27 12:29:22
>>121
仕様を聞いてるのかコーディングを聞いてるのか

125:デフォルトの名無しさん
07/06/27 13:37:21
コーディングです、入力した文字をGoogleで検索させたいのですが

126:デフォルトの名無しさん
07/06/27 13:41:57
エンコードの必要な文字コードかどうか判定して、
必要ならエンコードすればいい。

127:デフォルトの名無しさん
07/06/27 13:47:55
>>125
まずUTF-8に変換して、1バイトずつ見て非ASCIIを変換。

128:デフォルトの名無しさん
07/06/27 13:59:30
仕様はわかってるらしいから、そういう説明じゃ足りないんじゃないのかな
数値を16進文字列にするやりかたがわからないとかじゃないの?

129:デフォルトの名無しさん
07/06/27 14:13:40
unsigned char にキャストして sprintf で %%%02X すりゃいいと思うけど、
sprintf を使う場合はバッファオーバーフローに注意だな。
別にこの程度なら自前で変換してもいいんだけどね。

130:デフォルトの名無しさん
07/06/27 14:32:11
>>126-129
ありがとうございます、>>128さんの言うとおりでした
>>129さんを参考にしてやってみます

131:デフォルトの名無しさん
07/06/27 14:47:25
質問です。
C言語って色々命令作れる前に、最初からhファイルを読み込んで使える、
いわばインストール時に標準搭載されている命令ってあるじゃないですか。studio.hのprintfやmath.hのsqrtとか
ああいう命令を分かりやすくどんな用法で使えばいいのかが全て網羅してある
本またはサイトはありますか?

132:デフォルトの名無しさん
07/06/27 14:49:28
>>131
標準ライブラリ関数でぐぐれ

133:デフォルトの名無しさん
07/06/27 14:53:42
>>131
JIS

134:デフォルトの名無しさん
07/06/27 15:15:53
>>131
命令て。
まず入門書くらい買え。

135:デフォルトの名無しさん
07/06/27 15:16:24
ああ、「本または」って書いてあるね。すまんすまん。
じゃ、「作ってわか(ry

136:デフォルトの名無しさん
07/06/27 17:01:07
>>132-135
ありがとうございます。参考になりました

137:デフォルトの名無しさん
07/06/27 20:05:46
文字列の数字を消したいプログラム(例えばAB1C9をABC)をつくりたいんですけど
下のソースではうまく消えません。もしよければどのようにすればいいか指導お願いします。
#include <stdio.h>

void kesi(char *str){
char c;

while(*str!='\0') {
c=*str;
if(c<'0'||c>'9'){ //数字でないならば
*str=c;
}
str++;
}
}
int main(void){
char str[100];

scanf("%s",str);

kesi(str);
printf("%s",str);

return 0;
}

138:デフォルトの名無しさん
07/06/27 20:12:34
消した分だけ後ろの文字列を前に詰めないといけない。
void kesi(char *str) {
  char *to = str;
  while (*str != '\0') {
    char c =*str;
    if (!isdigit(c)) {
      *to = c;
      to++;
    }
    str++;
  }
  *to = '\0';
}

139:デフォルトの名無しさん
07/06/27 20:23:48
138さん返信ありがとうございます。 char *toとしてますが、
またポインタ宣言しなければ、ダメなんでしょうか??
あと初心者なのでisdigitとかまだよくわからないです…。もしよければアドバイスおねがいします

140:デフォルトの名無しさん
07/06/27 20:27:42
宣言しなきゃコンパイルできないし、isdigitはググれば山ほど出てくる

141:デフォルトの名無しさん
07/06/27 20:30:57
137のソースではただのchar c; としてポインタで宣言しないでも
コンパイルは通ったんですけど…なぜポインタを使うのかよくわからなくて…。

142:デフォルトの名無しさん
07/06/27 20:32:55
138では、詰める前の文字を指すのにstrを使い、
詰めた後の文字を指すのにtoを使っている。

143:デフォルトの名無しさん
07/06/27 20:39:59
ポインタを使わないと、どこに文字をいれていいかわからないから

144:デフォルトの名無しさん
07/06/27 20:42:04
>>142さん、わかりやすかったです!ポインタの理由が理解できました!

145:デフォルトの名無しさん
07/06/27 21:15:37
>>98
でも有名な話ですよね。

146:デフォルトの名無しさん
07/06/28 00:02:40
キューのプログラムで
#define QUEUE 5
static int i = 0;
i = (i+1)%QUEUE;
で次の添字が得られる
とか書いてあるんですが、よくわかりません。
常にiは0である気がするんですが、どこが間違っています?

147:デフォルトの名無しさん
07/06/28 00:13:33
(0+1) % 5 == 1
(1+1) % 5 == 2
(2+1) % 5 == 3
(3+1) % 5 == 4
(4+1) % 5 == 0
(0+1) % 5 == 1

148:デフォルトの名無しさん
07/06/28 00:16:59
初期化とキーボード入力以外で文字列を一回で代入する場合はstrcat()しかないですよね?


149:デフォルトの名無しさん
07/06/28 00:21:51
そんなことないよ

150:デフォルトの名無しさん
07/06/28 00:22:37
>>147
ありがとうございます。
ですがもう少し。
a%bってあったら「aをbで割った余り」ですよね?
だとすると、
(0+1)%5 = 1%5 = 0?
ではないのですか?

151:デフォルトの名無しさん
07/06/28 00:23:13
>>149
何がありますか?
教えてください


152:デフォルトの名無しさん
07/06/28 00:23:30
って書いたらわかりました。
スレ汚しごめんなさい。

153:デフォルトの名無しさん
07/06/28 00:23:51
1÷5
1は5で割り切れないので終了。余り 1

154:デフォルトの名無しさん
07/06/28 00:24:31
strcpyとか

155:デフォルトの名無しさん
07/06/28 00:27:32
>>151
strncat,strcpy,ctrncpy,sprintf,sscanf
ざっと思いつくのでこの程度。
あと、可変個引数使うときにある、printfのやつ。
あんま使ったこと無いから忘れたけど、vsprintfだっけ?

156:デフォルトの名無しさん
07/06/28 00:28:03
>>152
どちらさまですか?

157:デフォルトの名無しさん
07/06/28 00:28:28
>>150
おぬしは間違いなくstaticについて理解していない。
なぜstaticが付いているのかを考えるのじゃ

158:デフォルトの名無しさん
07/06/28 01:02:20
質問です。
BASICのgotoみたいな命令はないのでしょうか?

159:デフォルトの名無しさん
07/06/28 01:02:33
Cで書いてコンパイルしたファイルを人に送ってもその人は実行できないんですか?
というかできなかったのです。一瞬だけ実行されてすぐ消えてしまいます。
どうすればいいかわかりますか?

160:デフォルトの名無しさん
07/06/28 01:05:29
>>158
gotoというそのまんまの命令がある
loop:
printf("test");
goto loop;
みたいに使う

>>159
コマンドプロンプト経由で使えばおk

161:デフォルトの名無しさん
07/06/28 01:06:30
あ、ちなみにif文で条件を満たしていなかったらmainの一番上まで戻るというのがやりたいのですが・・・・

162:デフォルトの名無しさん
07/06/28 01:10:52
>>160
そのファイル名のみを相手のコマンドプロントでコマンドさせるってことですか?

163:デフォルトの名無しさん
07/06/28 01:12:28
構造体とポインタはどちらのほうが理解するのが難しい?

164:デフォルトの名無しさん
07/06/28 01:13:18
>>161
int main(void){
start:
〜いろいろな処理〜
if(条件を満たしていない) goto start;


多分普通の人であれば
int main(void){
do{
〜いろいろな処理〜
}while(条件を満たしていない);

165:デフォルトの名無しさん
07/06/28 01:13:31
おつむのレベルによる。

166:デフォルトの名無しさん
07/06/28 01:14:04
>>162
渡したファイルはexe?
コマンドプロントで、exeのあるディレクトリに移動して実行すればオケ。

167:デフォルトの名無しさん
07/06/28 01:15:06
>>163
一般的にはポインタが難しいと言われる。

168:デフォルトの名無しさん
07/06/28 01:16:06
>>162
1.コマンドプロンプトを起動してもらう
2.コマンドプロンプトにexeファイルをドラッグアンドドロップしてもらう
3.Enterキーを押してもらう

これが一番手軽だと思う

169:デフォルトの名無しさん
07/06/28 01:17:32
>>167
ポインタって何に便利なの?

170:デフォルトの名無しさん
07/06/28 01:18:24
何に便利とか言い出すから一向に理解できないんだろ。

171:デフォルトの名無しさん
07/06/28 01:19:15
>>166
>>168
ありがとうございました

172:デフォルトの名無しさん
07/06/28 01:20:43
>>169
必要にならないと分かりにくいと思う

173:デフォルトの名無しさん
07/06/28 01:24:36
>>169
Nバイトの構造体配列をソートして並び替えることを考える。
このとき、Nバイトのコピーが頻繁に発生することになる。
構造体に対するポインタの配列として保存していた場合、ポインタのソートで済むことになる。
例えばポインタが4バイト、構造体が100バイト超とかで配列が1000超とかだとすれば
どちらが効率的かはわかるよね?

174:デフォルトの名無しさん
07/06/28 01:24:45
Cpad for Borland...ってやつで書いてるんですけどexeファイルがありません。
どうすればいいですか?
171と同一人物です

175:デフォルトの名無しさん
07/06/28 01:29:33
>>170
お前がその便利さを知らない、説明できないだけだろ?えせプログラマは
こんなところで質問者をたぶらかしてないで、へちょいプログラマで満足してろよ?

176:デフォルトの名無しさん
07/06/28 01:29:34
>>174
ファイルを保存している場所と同じ場所にexeファイルがあると思われ

177:デフォルトの名無しさん
07/06/28 01:30:55
>>175
へちょくないあなたがへちょい>>170の代わりに答えてあげてください

178:デフォルトの名無しさん
07/06/28 01:34:22
>>176
あるにはあるのですが、ドラッグアンドドロップはできませんし、
そのディレクトリに移動して 〜.exe と打っても実行されません

179:デフォルトの名無しさん
07/06/28 01:40:02
>>178
コマンドプロンプトって何かわかってるか?

180:デフォルトの名無しさん
07/06/28 01:42:45
なんか全体的に黒いやつですよね?
わかってるつもりです

181:デフォルトの名無しさん
07/06/28 01:43:02
Wikipedia項目リンク

182:デフォルトの名無しさん
07/06/28 01:45:17
>>180
「notepad」って打ってメモ帳が起動するか?
ドラッグアンドドロップでフルパスが表示されて、エンター押して実行できると思ったんだけどなぁ

183:デフォルトの名無しさん
07/06/28 01:48:14
>>182
メモ帳はでてきます。
でもファイルをドロップしようとすると○の中に×が入ってるようなのが出てきて
できません

184:デフォルトの名無しさん
07/06/28 01:49:57
もしかしてvistaか?

185:デフォルトの名無しさん
07/06/28 01:50:51
>>183 ちょっwwwwwww伏字エロいwwwwwwwww
ティ○ポの中にオ×コが入ってるようなので とか妄想しちゃうぞwwwww

186:デフォルトの名無しさん
07/06/28 01:51:04
>>183
xpとかだとドラッグアンドドロップできないようになってるのかな?
じゃぁあきらめてフルパス(c:\cpad\test.exeみたいなやつ)を打って実行するべし
入力面倒だけど。

187:デフォルトの名無しさん
07/06/28 01:54:18
>>186
Vistaですよ。
かなりめんどいってことですね〜〜…
ありがとうございました

188:デフォルトの名無しさん
07/06/28 01:55:23
VistaはD&Dできないのか・・・ ひとつ勉強になった。

189:デフォルトの名無しさん
07/06/28 01:56:12
セキュリティ云々でできなくなったそうだ

190:デフォルトの名無しさん
07/06/28 01:57:04
なぁ〜〜に、こうすりゃええがな。XPを仮想PCにインストール。仮想PCでプログラミング
あっ武勇伝、武勇伝、武勇でんでんででんでんっ♪

191:デフォルトの名無しさん
07/06/28 02:41:46
ポインタが無かったらprintfすら・・・

192:デフォルトの名無しさん
07/06/28 02:43:50
ファイル操作も出来ないね

193:デフォルトの名無しさん
07/06/28 03:03:13
そもそもポインタって何?実体は?それが理解できていないとダメ。
Wikipedia項目リンク

194:デフォルトの名無しさん
07/06/28 07:10:08
2つの文字列を指すポインタ(例えばs1はABC、s2はABを指してる)で
下のソースコードだと2つの文字列が改行にいくまで繰り返すって言う意味ですかね?
while((*s1 != '\n') || (*s2 != '\n'))
{〜〜
s1++;
s2++}

195:デフォルトの名無しさん
07/06/28 07:12:03
(;^ω^)恐ろしいコード

196:デフォルトの名無しさん
07/06/28 07:18:58
すいません、ちょっと適当に書き込んだんで…。
ホワイルの中身の意味が知りたくて。

197:デフォルトの名無しさん
07/06/28 07:21:18
>>194
そのロジックだと、s1、s2の改行文字の位置が揃っていないと誤動作しそうだが。
#つーか、>194自身が挙げたサンプルで死亡確定だな。

198:デフォルトの名無しさん
07/06/28 07:57:55
>>194
s1にもs2にも改行コードないからプログラム起動して即吹っ飛ぶ。
s1がABC\n、s2がAB\nだったとしても一致しないのでやっぱり吹っ飛ぶ。
そのコードはs1とs2の改行コード位置が一致した場合にループ抜ける。

199:デフォルトの名無しさん
07/06/28 08:00:03
〜〜の中にきっとbreakが含まれてるんだ

200:デフォルトの名無しさん
07/06/28 08:45:23
C言語の精度って小数点以下いくつなんでしょうか??

201:デフォルトの名無しさん
07/06/28 08:49:39
そういう精度の決まり方じゃない。
これの IEEE 方式。
Wikipedia項目リンク

202:デフォルトの名無しさん
07/06/28 08:50:57
言葉が足りなかった。
IEEE 方式のマシンが多い、と。
別にエクセス 64 のマシンでも C は使える。

C かどうかで決まるものではなく、
CPU が何かによって決まるもの。

203:デフォルトの名無しさん
07/06/28 10:07:58
うん、それで、小数点以下いくつなんでしょうか??

204:デフォルトの名無しさん
07/06/28 11:11:40
>>203
>>201に書いてあるだろ

205:デフォルトの名無しさん
07/06/28 11:14:24
>>203
だから小数点以下いくつという形の精度じゃないと。
「浮動」小数点ってのは、そういう事だ。

206:デフォルトの名無しさん
07/06/28 12:07:34
有効桁数って、確か中学で習うよな…?

207:デフォルトの名無しさん
07/06/28 14:02:25
10進数だとIEEEの64ビット浮動小数点は小数点以下15桁ぐらいかな。
但しそれに掛ける10のn乗という指数が付くわけだが。


208:デフォルトの名無しさん
07/06/28 14:16:16
有効桁数15〜16桁あたりだな。
本当は2進数で考えないといけないんだけど。

209:207
07/06/28 14:21:03
#include <stdio.h>
#include <values.h>

int main(void)
{
printf("%d, %Lg, %Lg\n", sizeof(long double), LDBL_MAX, LDBL_MIN);
printf("%d, %g, %g\n", sizeof(double), DBL_MAX, DBL_MIN);
printf("%d, %g, %g\n", sizeof(float), FLT_MAX, FLT_MIN);

return 0;
}

gcc 4.1.1 (i386-redhat-linux) で上記のソースをコンパイルして
動かすと結果はこう出る。

12, 1.18973e+4932, 3.3621e-4932
8, 1.79769e+308, 2.22507e-308
4, 3.40282e+38, 1.17549e-38

e から後ろの部分が指数で「掛ける10のn乗」を表す。
3.3621e-4932 は 3.3621 掛ける10の -4932 乗だ。

但し上記の結果は環境依存で、同じ gcc でもコンパイルオプションに
よっては変わってしまう。だから全てについてこうであるという保証は
できない。(values.h も gcc 独自のヘッダかも知れない)。ただ大雑把に
言えることは float よりは double、また double よりは long double
の方が多くの範囲をカバーできるかも知れないというだけだ。
(コンパイラによっては long double はないかも知れないが)。


210:デフォルトの名無しさん
07/06/28 17:00:08
ISO準拠の処理系ならlong doubleは必ずある。
209が使っている定数は<float.h>で提供されている。

211:デフォルトの名無しさん
07/06/28 17:01:51
long double は必ずある。
しかし、double と同じサイズのこともある。

212:デフォルトの名無しさん
07/06/28 17:10:52
putchar関数の意味がよくわかりません。
質問が抽象的すぎてごめんなさい

213:デフォルトの名無しさん
07/06/28 17:12:06
標準出力に文字(char)を一文字出力(put)する

214:デフォルトの名無しさん
07/06/28 17:42:10
…?
putchar('\n')
ってのはどういうことですか?

215:デフォルトの名無しさん
07/06/28 17:48:00
標準出力はわかるか?
 通常は画面だと思っていい。
\n はわかるか?
 改行コードをあらわすエスケープシーケンスだ

つまり、画面上で改行する、ということ

216:デフォルトの名無しさん
07/06/28 17:50:19
それは
printf("\n")
とは違うんですか?

217:デフォルトの名無しさん
07/06/28 18:07:45
printf は文字列を扱う
たまたまprintfで1文字出力するなら、putchar と同じ様になるな。
でも、printf の第一引数の文字列は % とか入ると違ってくるけどな。

218:デフォルトの名無しさん
07/06/28 18:08:09
"\n" は文字列
'\n' は文字


219:デフォルトの名無しさん
07/06/28 18:31:55
でもこの場合では意味することは同じなんですよね?
というか、putcharでできることはprintfでもできるんですか?


220:デフォルトの名無しさん
07/06/28 18:32:55
できるけど、効率は悪い。

221:デフォルトの名無しさん
07/06/28 18:35:29
それは打つ文字数が多くなるとかいうレベルの話ですか?
プログラムの内容には関係ないですよね?

222:デフォルトの名無しさん
07/06/28 18:36:12
あります。

223:デフォルトの名無しさん
07/06/28 18:40:48
printf は文字列を解析して
% が出てきたらどうするかとかいう処理を行ってる。
ま、出力自体のコストに比べりゃ微々たる差だがね。

224:デフォルトの名無しさん
07/06/28 18:41:45
適材適所だ
printfで全部まかなうのもいいし、使い分けるのもいい。
同じことができるなら、片方はまったく無駄だと思ってるなら
それはキミが初心者だから。

225:デフォルトの名無しさん
07/06/28 18:42:18
最近のコンパイラは賢いから、>>216なんかはputchar('\n');に最適化されるけどな。

226:デフォルトの名無しさん
07/06/28 18:43:47
そこまでするのか! っていう最適化が
意外とされてるんだなあ。

227:デフォルトの名無しさん
07/06/28 18:48:02
gccは printf("%s\n", "hoge"); を puts にしてくれたりするよね。

228:デフォルトの名無しさん
07/06/28 18:52:36
>>227
こういうのってどうやって知るんですか?
○は□に最適化されるとか

229:デフォルトの名無しさん
07/06/28 18:55:28
逆アセンブルしてもいいし、
両方のパターンを書いてコンパイルして
バイナリ比較して等しくなるかどうか確認したのでも。

230:デフォルトの名無しさん
07/06/28 18:57:45
すごい!

231:デフォルトの名無しさん
07/06/28 19:08:41
普通に gcc -S

232:デフォルトの名無しさん
07/06/28 19:31:12
特徴的なものは宣伝していたりマニュアルに書いてあったりもする。

233:デフォルトの名無しさん
07/06/28 20:31:57
スーパーハカーは自分で逆アセして知る。
一般人は掲示板で知る。

234:デフォルトの名無しさん
07/06/28 21:16:58
確かに。
普通のハッカーなら掲示板でヒントを読んで自分で試して知るだろうな。

235:ぴっころ
07/06/28 21:32:59
突然お邪魔致します。ぴっころです。
2進数で表した時、2の倍数は最下位ビットが0になる事が分かりました。
では3の倍数は何かこのような決まりはあるのでしょうか?

236:デフォルトの名無しさん
07/06/28 21:33:54
3進数で3の倍数は最下位ビットが0

237:ぴっころ
07/06/28 21:36:37
言葉足らずで申し訳ありません。
2進法で表した時です。

238:デフォルトの名無しさん
07/06/28 21:37:00
ぴっころって誰だよ。

239:デフォルトの名無しさん
07/06/28 21:38:42
>>235
ヒント1 : 2の倍数とは偶数のこと
ヒント2 : 3の倍数を並べてみよう

240:デフォルトの名無しさん
07/06/28 21:45:18
2 進法では別に 3 (11) の倍数に特徴はないなあ。
3 (11) で割ったら余りが 0 になるということくらいだな。

241:デフォルトの名無しさん
07/06/28 21:45:44
>>235
数学の問題だなあ。

3で割ると余り0

なんてのはあまり意味ないか・・・。

10進数で表した時に各桁を足して3の倍数ならそれは3の倍数
(123は1+2+3=6なので3の倍数)なんてのもあるが、関係ないね。


242:デフォルトの名無しさん
07/06/28 21:51:23
3の倍数を2進法で表したものは、正規表現/(0|1(00)*1)*/にマッチする。

243:ぴっころ
07/06/28 21:51:33
>>238 ドラゴンボールのぴっころから取らせて頂きました。
>>239
   11
  110
 1101
 1100
 1111
10101
11000
11011
繰り返しもあるような無いような・・・。
ちょっと僕のキャパでは厳しいです・・・。

244:デフォルトの名無しさん
07/06/28 21:53:59
>>243
18はどこへ消えた

245:デフォルトの名無しさん
07/06/28 21:54:19
>>242
発想はいいがちょっと惜しいな。

1000000001の間に11を入れて1011000001も3の倍数だ。

246:デフォルトの名無しさん
07/06/28 21:55:49
>>243
うそだ!
NHKのじゃじゃまる、ぴっころ、ぽろりのぴっころだろ?

247:デフォルトの名無しさん
07/06/28 22:06:53
bccってのをXPで使ってたんですが、vistaに変えたんですが環境設定ソフトでPATHの設定が出来ませんってのが出るんですが・・・・
vista出使える環境設定ソフトかPATHの設定方法を教えてください。

248:ぴっころ
07/06/28 22:08:04
   11
  110
 1101
 1100
 1111
10010
10101
11000
11011
11110
11→10→01→00
・・・。
ちょっときついです。
教えてもらえると助かります。

249:デフォルトの名無しさん
07/06/28 22:09:42
1101のどこが3の倍数なんだよ。

250:デフォルトの名無しさん
07/06/28 22:11:40
 1101
 1100

数が減ってるな
まぁ1001の書き間違いだろうからそれくらい勘弁してやれ

251:デフォルトの名無しさん
07/06/28 22:12:59
>>247
マイコンピュータのプロパティの中にない?
XP/2003まではそこにあるんだけど。

252:デフォルトの名無しさん
07/06/28 22:23:37
6bitでカルノー図書いてみたんだが一切簡単化できねーから周期性は無い臭い

253:デフォルトの名無しさん
07/06/28 22:30:16
>>251
システムのプロパティの中に環境変数でpathってのは見つけましたが違います?
マイコンピュータでプロパティやるとシステムのプロパティかCドライブのプロパティあたりしか出てきません。

254:デフォルトの名無しさん
07/06/28 22:31:30
3の倍数で偶数に該当するものをリストアップしてやんよ
6 000000110
12 000001100
18 000010010
24 000011000
30 000011110
36 000100100
42 000101010
48 000110000
54 000110110
60 000111100
66 001000010
72 001001000
78 001001110
84 001010100
90 001011010
96 001100000

255:デフォルトの名無しさん
07/06/28 22:32:08
>>253
たぶんそれでおk。

256:デフォルトの名無しさん
07/06/28 22:35:43
>>255
それをどうすればいいかわかります?

257:デフォルトの名無しさん
07/06/28 22:39:43
すみません、学校の電卓プログラム問題で、わからない事があるので教えてください。

char *get_int(char *b, char *i)
{
int sign, num = 0;
if(*b == '-')
{
sign = -1;
b++;
}
else sign = 1;

/*初期値*/
*i = 0;
/*スペーススキップ*/
SKIP(b);
/*十進数文字である間繰り返し*/
while (isdigit(*b)) {
num++;
/*これまでに得た整数の位取りアップ*/
*i *= 10;
*i += (*b - '0');
b++;
}
/*十進数文字がなければエラーリターン*/
if (num == 0) b = NULL;
return b;
}

上記は自分がわかる範囲でマイナス演算子を付け加えたのですが、
これからどうしていいのかわからないので、
どなたか教えてください。よろしくお願いします。

258:デフォルトの名無しさん
07/06/28 22:42:35
> これからどうしていいのかわからない
だったら、それはお前のわかる範囲ではない。

259:デフォルトの名無しさん
07/06/28 22:43:02
>>257
その一部じゃさっぱり。うpロダ使って全体をうpせい。それから実行結果の例も書いてくださいな

260:デフォルトの名無しさん
07/06/28 22:44:16
(*b == '-')

かわいい

     ∧∧
〜(*b == '-') <ニャー
  >>  >>

261:デフォルトの名無しさん
07/06/28 22:46:19
>>248
全ての3の倍数は、その数を3で割っても最下位ビットは変わらない。

262:デフォルトの名無しさん
07/06/28 22:46:26
x = ( 'A'); やる気ねぇ〜顔

263:ぴっころ
07/06/28 22:47:09
>>254
なるほど。
6 00 00001 10
12 00 00011 00
18 00 00100 10
24 00 00110 00
30 00 00111 10
36 00 01001 00
42 00 01010 10
48 00 01100 00
54 00 01101 10
60 00 01111 00
66 00 10000 10
72 00 10010 00
78 00 10011 10
84 00 10101 00
90 00 10110 10
96 00 11000 00
下二桁 00→10の繰り返し、
下二桁より上 1ずつ増えているのは分かりました。 
ですが、これで1000000001の間に11を入れて1011000001も3の倍数だ。
が何故言えるのでしょう?あと、3の倍数に偶数が入ってくる理由も・・・。

264:デフォルトの名無しさん
07/06/28 22:47:21
+= (*b - '0'); < 私を置いていくにゃ〜

265:デフォルトの名無しさん
07/06/28 22:48:53
>>263
それは3の倍数じゃなくて6の倍数でわ?

3の倍数 かつ 偶数 = 6の倍数ですよ

266:デフォルトの名無しさん
07/06/28 22:49:05
ファイルを指定した場所へ移動するにはどうしたらいいですか?

267:デフォルトの名無しさん
07/06/28 22:49:48
>>256
BCCをインストールしたディレクトリのBinディレクトリとかのフルパスをPATHとかに追記する(セミコロンでつなげる)

268:デフォルトの名無しさん
07/06/28 22:51:18
>>263
それ6の倍数並べてるだけじゃん

269:デフォルトの名無しさん
07/06/28 22:53:36
>>263
単にそれは、例えば10進法で、15の倍数を並べたら一の位に0と5が交互に現れる、

ってことを言ってるのと同じだよ

270:デフォルトの名無しさん
07/06/28 22:54:11
>>267
どもです。
やってみます。

271:デフォルトの名無しさん
07/06/28 22:57:07
3の倍数、偶数抜き。何か法則がある?
3 000011
9 001001
15 001111
21 010101
27 011011
33 100001
39 100111

272:デフォルトの名無しさん
07/06/28 22:59:31
A(n) = A(n-1) + 6

273:デフォルトの名無しさん
07/06/28 23:13:28
>>235
3の倍数は、奇数ビット目の1の数と、偶数ビット目の1の数の差が、3の倍数になる。
ただし、差が3の倍数といっても数が小さいうちはずっと0。

例:39
100111、奇数ビット目=2、偶数ビット目=2、差=0

274:デフォルトの名無しさん
07/06/28 23:25:45
分からないなら、10進数で同じコトを考えてみればいいよ

10進数だと、10の倍数は1の位が0だということが分かりました。
では11の倍数は、何か特徴があるのですか?

11
22
33


1の位が1ずつ増えていくことが分かりました!


…この結果で何か得られることはあると思うか?


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5394日前に更新/185 KB
担当:undef