C言語なら俺に聞け(入門編)Part 79

このエントリーをはてなブックマークに追加
801デフォルトの名無しさん
>>799
逆にバカっぽいw
802デフォルトの名無しさん:2011/03/06(日) 13:09:49.01
配列
int cnt[]の[]内の部分の番号をあらわす数字ってchar型ですか?int型ですか?
cnt['0'],cnt['1']となってるんですが、char型でしょうか?

printf("%d",cnt[i]);ともなってるのでint型でもどっちでもいいのでしょうか?
803デフォルトの名無しさん:2011/03/06(日) 13:14:48.47
[]の中は整数数値、基本はint型(処理系依存かもしれん)。
'0'は整数数値、で'0'の基本はint型の整数(処理系依存かもしれん)。
804デフォルトの名無しさん:2011/03/06(日) 13:22:34.65
int型配列だから全部int型
805デフォルトの名無しさん:2011/03/06(日) 13:23:38.87
>>804
インデックスの型と配列の型は関係ない。
806デフォルトの名無しさん:2011/03/06(日) 13:36:48.06
pointer[index]は*(pointer + index)の糖衣構文。
pointerが何かのポインターである限り、それに加え得るのは整数型のみ。
また、文字'0'は整数型。
いずれにしても、asciiと互換性のある文字セットならcnt['0']は*(cnt + 48)の糖衣構文だ。
807デフォルトの名無しさん:2011/03/06(日) 14:37:06.06
>>803
じゃぁcnt[1]もcnt['1']も一緒なんですね。


後、cnt[str[i]-'0']ってプログラムの部分であるんですが
なんで-'0'とかあるんですか?0引いても[]の中関係なくないですか?
808デフォルトの名無しさん:2011/03/06(日) 14:39:57.19
char型の1からchar型の0引くとint型の1が出てくるって理屈かな
809デフォルトの名無しさん:2011/03/06(日) 14:44:13.59
>>807
>じゃぁcnt[1]もcnt['1']も一緒なんですね。

一緒じゃない。
'1'のほうは'1'の文字コードが入る。
810デフォルトの名無しさん:2011/03/06(日) 14:46:02.79
>>807
>>806 でも同じこと言ってるけど一応マジレスしておくと
'0' っていうのは文字リテラルという表記方法で整数0とは違うの
その処理系の文字コードがASCIIなら'0'==0x30、即ちcnt['0']==cnt[0x30]なわけ
Are you OK?
811デフォルトの名無しさん:2011/03/06(日) 14:49:25.78
Yes, I am Okada Katsuya.
812デフォルトの名無しさん:2011/03/06(日) 14:55:01.16
NO, You are ? Okada Katsuya.
813デフォルトの名無しさん:2011/03/06(日) 15:06:55.80
>>807
若いなぁ、その問い詰めかた。
君のニキビだらけの顔が目に浮かぶよ。

あと、この場合はもっと丁寧に
「配列の添え字には、何型を使えば良いですか?」
と質問すべきだったね。

そうすれば、
「size_t というものがあってだな・・・」
みたいな回答が貰えたのに。
814デフォルトの名無しさん:2011/03/06(日) 16:05:42.00
きも
815デフォルトの名無しさん:2011/03/06(日) 21:32:57.44
>>808
いや、一瞬そう思いましたが、[]内はchar型で計算してるんだから、
charにあたる数字が出てくるんじゃないですか?

うーん良く分からん、main内での数え上げでは[]内はintで処理してたのに
どういうことなんだろ。気にしなくてもいいんですけどね。
816デフォルトの名無しさん:2011/03/06(日) 21:33:27.02
まぁでも機械が読み取りしてくれる処理としては添え字として
読み取ってくれるなら別に[]内はintでもdoubleでもcharでもいいような気はしますね。

その概念からするとchar[]配列に代入するとき

char[]='0'じゃなくてもchar[]=0でもいい気がしませんか?
817デフォルトの名無しさん:2011/03/06(日) 21:36:46.95
'1'-'1'=0
だろ〜
じゃー
'1'-'0'=1
になるんじゃね〜
818デフォルトの名無しさん:2011/03/06(日) 21:41:32.08
>>815
> char型で計算してるんだから、
> charにあたる数字が出てくるんじゃないですか?

Cのcharは文字じゃなくてサイズの小さい整数型だから。
819デフォルトの名無しさん:2011/03/06(日) 21:51:48.63
つーか、文字定数はintだってば
820デフォルトの名無しさん:2011/03/06(日) 22:30:03.74
>>816
なにを主張したいんだか判らんヤッちゃな
もしかして a['0'] == a[0] が望みか?
ならC言語なんか使わずにJavaScriptにしろ
821デフォルトの名無しさん:2011/03/07(月) 00:27:49.31
まず、'0'〜'9'は連続していることが規格で保証されている
次にstr[]がchar型の配列なら{cnt[str[i]-'0']}は{cnt[char型-int型]}なので
暗黙的に型変換が起こり{cnt[((int)char型)-int型]}となる
結果、str[i]が'0'〜'9'の範囲内で、差し引くint型が文字定数の'0'であれば
その差として、int型の0〜9が得られるので、{cnt[n(0<=n<=9)]}となる
822デフォルトの名無しさん:2011/03/07(月) 08:07:25.55
int cenk;
cenk='A'
printf("%d",cenk);

出力は65と出るのですが、'A'はchar型なのにintに代入できるんですか?
またcharとintは型の種類、サイズが違うから、char型の65と、int型の65
は違うものですか?
823デフォルトの名無しさん:2011/03/07(月) 08:14:11.48
>>822
コンパイルエラー
つーか>>819を千回くらいよめ
824デフォルトの名無しさん:2011/03/07(月) 08:23:04.12
>>823
文字定数はintなら
>>>822はエラーじゃないですよね?
825デフォルトの名無しさん:2011/03/07(月) 08:23:45.21
>>824
コピペしてコンパイルしてから言え
826デフォルトの名無しさん:2011/03/07(月) 08:34:12.88
#include<stdio.h>
int main(void)
{int cenk; cenk='A'; pirntf("%d",cenk);
return (0);}

エラーなしです
827デフォルトの名無しさん:2011/03/07(月) 08:35:54.50
>>819を千回読んだ上で何が知りたいんだ?
828デフォルトの名無しさん:2011/03/07(月) 08:42:12.61
よくunsigned xとかあるのですが、これはint型なのかchar型かよく分かりません。
なんですか?
829デフォルトの名無しさん:2011/03/07(月) 08:44:09.55
暇人による壮大な釣りジャマイカ
830デフォルトの名無しさん:2011/03/07(月) 08:44:45.05
>>828
型が省略されたときはint
831デフォルトの名無しさん:2011/03/07(月) 08:47:20.47
>>830
ありがとうございます
832デフォルトの名無しさん:2011/03/07(月) 08:52:59.12
配列の場合scanf("%s",run[i]);といった感じで&を省略できるのは何故ですか?
また&run[i]としたらだめなのですか?
833デフォルトの名無しさん:2011/03/07(月) 08:55:27.62
run[i]の型次第
つーか、いい加減ウザイ
834デフォルトの名無しさん:2011/03/07(月) 09:03:39.41
>>833
intの場合
&run[i]はダメですか?
決まりごと多いですよねぇ。
835デフォルトの名無しさん:2011/03/07(月) 09:06:41.39
>>834
条件次第では&run[i]は動くかもよ
まぁ、想定している動作とは違うかもしれんが
836デフォルトの名無しさん:2011/03/07(月) 09:09:02.68
run[i]も動くかもしれんが、キャストしなくても有効なのか…?
まぁ、そこら辺の細かい規定までは知らんな…
837デフォルトの名無しさん:2011/03/07(月) 09:13:10.17
>>836
キャストってなんですか?
838デフォルトの名無しさん:2011/03/07(月) 09:15:33.00
scanf()は色々罠があるからお勧めしないが、判って使うなら止めない。
せめて、fgets()+sscanf()を利用した方がましではある。
それでも回避できない罠。
・バッファオーバランの恐れ
%sは生で使わずできるだけ%99sのようにサイズを指定した方がいい。
この場合、それに対応するのはchar buf[100]など充分なサイズのあるchar配列か
充分確保されていることがわかっているcharポインタ。
・型チェックの曖昧さ
通常の関数呼び出しでエラーになるような引き数を渡してもエラーにならないケースが多い。
従って、型の管理は自分でしっかりやる必要がある。
ポインタを理解できていないなら、scanf()系は使うべきではない。
839デフォルトの名無しさん:2011/03/07(月) 09:24:46.91
>>837
おまいさんが考えてることとは違うと思うがこんな感じだ

#include <stdio.h>

int main() {
char s[20];
int x[20];
x[0] = (int) s;
scanf( "%s", x[0] ); // 明示的にキャストしなくても合法なのか?
scanf( "%s", &x[1] ); // 多分思惑とは違う動作
printf( "%s\n%s\n", (char *)x[0], (char *)&x[1] ); // 入力内容表示
return 0;
}
840デフォルトの名無しさん:2011/03/07(月) 09:34:23.32
>>838
バッファって何ですか?
841デフォルトの名無しさん:2011/03/07(月) 09:44:11.44
842デフォルトの名無しさん:2011/03/07(月) 09:50:17.82
C言語を極めるとどうなりますか?
843デフォルトの名無しさん:2011/03/07(月) 09:53:24.24
2chを見なくなります
844デフォルトの名無しさん:2011/03/07(月) 11:47:52.34
どのプログラミング言語もC言語と同じ様に関数呼び出しするとスタックに引数と戻りアドレスが格納されて関数終了時にその戻りアドレスで呼び出し元に戻るって処理方法なんですか?
845デフォルトの名無しさん:2011/03/07(月) 12:36:44.60
ほとんどはそうです
846デフォルトの名無しさん:2011/03/07(月) 15:02:16.13
Thx
847デフォルトの名無しさん:2011/03/07(月) 17:51:30.98
関数やスタックって概念や用語が登場しない言語とか
再帰が基本的にできなくて相当する処理を作るのが大変な言語とか
普通にあるぞ
848デフォルトの名無しさん:2011/03/07(月) 17:54:16.90
>>847
言語の表面上、
>関数やスタックって概念や用語が登場しない言語とか
有るが内部的には使ってるだろ
849デフォルトの名無しさん:2011/03/07(月) 18:07:41.21
アセンブラのCALLは関数なのか?
と言えば「はい」とでも「いいえ」とでも言えそうだし、
そもそも、ジャンプで代用できるし(代用したものは関数ではないのか?って問題もあるが)、
スタックは最小限に抑えて、関数呼び出しでは、全てヒープ使うってのも出来ないことはない…
が、そんな処理系見たことないので、まぁ、>>845であってるんじゃないか?
850デフォルトの名無しさん:2011/03/07(月) 18:31:31.91
ガチでスタックがなくて
一般にスタックがよく使われる用途までヒープだけなシステムや
それに由来する仕様の言語知らない?

> 代用したものは関数ではないのか?
クラスや多態がない言語でもやってることは同じだったりね
851デフォルトの名無しさん:2011/03/07(月) 18:38:54.22
>>850
インタプリタなら分かるが、それも含んだ話?
それとも、インタプリタ以外で有名なのってある?
852デフォルトの名無しさん:2011/03/07(月) 19:30:47.67
StacklessPythonとかの詰まらんオチに1票
853デフォルトの名無しさん:2011/03/07(月) 19:36:51.39
>>848
847が言ってるのは、
Brainfuckみたいな理論寄り言語のことでしょ
854デフォルトの名無しさん:2011/03/07(月) 19:46:52.83
NTLの使い方なんですが、ZZ型とchar型の配列に交互に変換する
関数が解りません。どうしたら変換できますか?ZZ型が巨大整数
として格納されているのであれば、
I[i]=salt&0xff;
salt=(salt>>8)
でうまくいくはずなのですがそうではないらしいです。
内部のことはよくわからないので知っている人がいたら教えてください。
よろしくお願いします。
855デフォルトの名無しさん:2011/03/07(月) 19:53:14.90
>>854
使ったことないから分からんけど、
シフト演算子がないのであれば、salt=(salt/256);で良いのでは?
856デフォルトの名無しさん:2011/03/07(月) 19:58:36.07
シフト演算子はあるのですが、salt&0xffが型が違うと言われます。
cannnot convert NTL::ZZ to char in assignment
857デフォルトの名無しさん:2011/03/07(月) 20:06:12.54
>>856
んじゃ、一旦、絶対値に修正
I[i]=salt%256; // 元の値が負であれば反転+1の処理追加
salt=(salt>>8);
でどうだ?
858デフォルトの名無しさん:2011/03/07(月) 20:11:03.06
>>856
しゃーないから調べてみた
to_ZZ とか to_long とかで相互変換できるみたい
859デフォルトの名無しさん:2011/03/07(月) 20:11:53.28
Iの型がおかしいんじゃね?
860デフォルトの名無しさん:2011/03/07(月) 20:12:21.93
出来ました!ありがとうございます。
まだ今度は読み込みの分があるのでそれで解らなくなったら聞くので
よろしくお願いします。
861デフォルトの名無しさん:2011/03/07(月) 20:14:36.02
ああなるほど&が使えないってことか
862デフォルトの名無しさん:2011/03/07(月) 20:16:48.83
マージソートとクイックソートの違いが良く分かりません、教えてください。
863デフォルトの名無しさん:2011/03/07(月) 20:18:48.71
はやっ!!もう戻ってきたΣ(´∀`;)
864デフォルトの名無しさん:2011/03/07(月) 20:23:33.19
>>862
その質問は下記と同じようなもの
もっと、意図をしぼって質問すれ
windowsとlinuxの違いが良く分かりません、教えてください。
865デフォルトの名無しさん:2011/03/07(月) 20:25:22.40
>>862
漠然とした質問には漠然としか応えられない

まず要素をばらばらにして、
それをくっつけながら並べ替えていくのがマージソート
要素全体を、大きいのと小さいのに
2分割する操作を繰り返すのがクイックソート
866デフォルトの名無しさん:2011/03/07(月) 21:21:24.49
クイックソートって名前には勝てないな
マージソートがどんなに速くてもクイックじゃないからな
867デフォルトの名無しさん:2011/03/07(月) 21:34:18.57
open(ARGF.filename + ".ecc") {|file|
while l = file.gets
l=l.to_i
ls=@I[ii]
ii=ii+1

lines += 1
fields += l.to_s.split(',').size
l^=(@P_y%(2**8*ls))
for i in 0..31
salt[i]=0
end
while(l>0)
i=0
while(i<ls)
salt[i]=l&0xff
salt[i]=sprintf("%c",salt[i])
l=(l>>8)
i=i+1
end
end
i=ls-1
while(i>-1)
g.write(salt[i])
i=i-1
end
end
これをCで書くとどうなりますか?教えてください。よろしくお願いします。
868デフォルトの名無しさん:2011/03/07(月) 21:59:39.98
元の言語が分からんので、他の奴に任せる
869デフォルトの名無しさん:2011/03/07(月) 22:03:45.93
パイソンとかルビーとかこんな感じだったような
870デフォルトの名無しさん:2011/03/07(月) 22:38:16.41
pythonだったらインデントが潰れてる時点でout
871デフォルトの名無しさん:2011/03/07(月) 22:41:08.68
それRubyだよ。でも知らないから教えられない、残念!
872 [―{}@{}@{}-] デフォルトの名無しさん:2011/03/07(月) 22:43:49.37
int main(void)
{
  system("echo open(ARGF.filename + (略) end > tmp.rb");
  system("ruby tmp.rb");
  return 0;
}
873デフォルトの名無しさん:2011/03/07(月) 23:09:22.38
http://www.shoup.net/ntl/doc/ZZ.txt の
// conversions between byte sequences and ZZ's
の使い方が解りません。
ZZFromBytes(salt,buf,32);
トやってもエラーが出ます。なぜですか?
874デフォルトの名無しさん:2011/03/07(月) 23:20:49.04
まえにいついてた暗号の人と同じ人かな。
875デフォルトの名無しさん:2011/03/07(月) 23:25:30.24
>>874
いや、円周率100桁人の可能性もある
876デフォルトの名無しさん:2011/03/07(月) 23:28:31.59
[]の人はどれも同じ人に見えるなw
877デフォルトの名無しさん:2011/03/08(火) 01:08:12.96
>>875
俺は大学生なんで、高度な質問はできませんよ。

ちなみに

現実では分かる事をあえて質問し優越感にひたり、ネットでは、
本当に分からない事を相手の羞恥心がむき出しになる程問い詰める。
というのがモットーです。

今年もよろしくお願いします。
878デフォルトの名無しさん:2011/03/08(火) 01:18:20.79
このスレ怖い、さらばじゃ

     ∧∧
ダッシュ!(;`д)
   と  つ
   〜(_つ
ε=ε= し′
879デフォルトの名無しさん:2011/03/08(火) 01:20:39.14
>>878
wwwwwwwwwwwwwwwwww
880デフォルトの名無しさん:2011/03/08(火) 02:45:20.51
NTLという演算ライブラリの中にあるZZ型について質問です。
ZZで作った巨大整数を、char型の配列にする場合はどのようにすれば
いいのでしょうか?

ZZ salt;
char buf[32];

for(i=0;i<32;i++){
buf[i]=salt%256;
salt=(salt>>8);
}
このように変換しようとしましたが、出来ませんでした。
整数ではなく文字が入っていました。どうすればいいのか解りません。
教えてください。よろしくお願いします。
881デフォルトの名無しさん:2011/03/08(火) 08:06:06.86
getchar()の使い方が良く分かりません。

ch=getchar();となってる場合どういうことでしょうか?
882デフォルトの名無しさん:2011/03/08(火) 08:47:49.70
getchar()の戻り値がchに入る。
883デフォルトの名無しさん:2011/03/08(火) 08:56:44.52
>>882
getchar()に123(int)を入力したい時はどうするんですか?
884デフォルトの名無しさん:2011/03/08(火) 09:13:31.90
プログラムではgetchar()に何かを入れることは、できません。
標準入力からは、たった一文字しか取ってきません。
文字列を入力したいのなら、fgets()でも使いましょう。
その文字列を数値として解釈したいのなら、atoi(), strtol(), strtod(), sscanf()等を使いましょう。
885デフォルトの名無しさん:2011/03/08(火) 10:41:10.18
Cの勉強したいのですが何からはじめればいいでしょう
本の少しかじった程度はできます。
886デフォルトの名無しさん:2011/03/08(火) 10:45:59.09
じゃあまずその本を少しかじった程度でやめるのではなくて熟読してマスターするといいんじゃないかな
887デフォルトの名無しさん:2011/03/08(火) 11:26:16.82
電卓でも作ってろカス
888謙虚フロンティア戦士:2011/03/08(火) 13:01:26.12
>>844
引数をスタックに積むのはレジスタが少ないCPU向けだな。
レジスタが豊富なCPUはスタックに積まずに直接
レジスタに入れて渡すケースが多い。
889デフォルトの名無しさん:2011/03/08(火) 13:29:19.53
>>888
呼び出し規約を調べてこいや
890謙虚オーラ戦士:2011/03/08(火) 13:34:51.03
>>885
オセロでも作ってろ
891謙虚フロンティア戦士:2011/03/08(火) 14:41:32.17
>>889
は?
呼び出し規約なんて呼び出し元と呼び出し先で
整合性とれればなんでもいいんだが。
892デフォルトの名無しさん:2011/03/08(火) 15:05:49.29
本を読んで電卓とオセロ作ることにします ありがとう
893デフォルトの名無しさん:2011/03/08(火) 15:08:04.24
数字の0って、NULLって書いてもいいですか?
894デフォルトの名無しさん:2011/03/08(火) 15:13:15.48
ダメです
895デフォルトの名無しさん:2011/03/08(火) 16:21:31.82
100 -> 1NULLNULL
896デフォルトの名無しさん:2011/03/08(火) 16:54:18.95
ttp://www.asahi-net.or.jp/~qb3k-kwsk/rpg/program/tutorial/t02s.htmlにあるような万年カレンダーで
意図しない値や文字が入力された場合(0.5や五十七など)に再入力を促す形に書き換えたいのですが、
どのようにすればよいでしょうか?scanfでなくfgetsで場合分けすればよいと思うのですが…。
897デフォルトの名無しさん:2011/03/08(火) 17:07:04.80
>>896
printf("月=");
while( (scanf( "%d",&m ) != 1) && ((m < 1) || (m > 12)) );
{
  printf("1〜12の間で入力してください。\n");
}

こんな感じ?
898デフォルトの名無しさん:2011/03/08(火) 17:09:14.83
&& じゃなくて || だね。

while( (scanf( "%d",&m ) != 1) || ((m < 1) || (m > 12)) );
899デフォルトの名無しさん:2011/03/08(火) 18:08:55.50
Objective-Cの初心者はここでええのん???
900デフォルトの名無しさん:2011/03/08(火) 18:10:35.07
質問文が長くなってしまったのでcodepadを使いました。

http://codepad.org/48Xk2I1R  

こちらの質問にお答えください。よろしくお願いします。