【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130 >950 じゃあなんで文字列はワード集合にならなかったの?
(アメリカでは)8bitあれば十分なのにメモリがもったいないから
>>926 最適化でどうとでもなることだろう・・・
最適化って言葉の意味わかってんのかなぁ
最適化というのはコンパイラの進化によって得られたものであって Cの規格が最適化しろと定めているわけじゃないぞ 逆に言えば、本当によくできたコンパイラなら、 文字定数がintだろうとcharだろうと charと比較したときの最適化の結果は同じにできるはず
よーするにCでは文字定数がcharでもintでもほとんど差がないから 「自然な整数はint」の法則に従ってintにしたってことだろ。 C++で事情が違うのは既出。
>>952 テキストデータというものが既にそういう仕様だったから。
あと、バイトの連続からなるデータを1バイトずつ処理するのは確かに手間がかかるけど、
文字列全体をまとめて扱うぶんにはワードで(2/4バイトいっぺんに)処理すれば済むから。
960 :
デフォルトの名無しさん :2007/02/01(木) 14:27:46
配列のサイズについて質問なのですが、 char data[100]; があったとして、そこにはサイトのURLなどが入ったりするとします。 たいていのURLは100文字未満なので、 dataにURLを入れた後、残りの長さの部分を切り詰めたい時には どうすればよいでしょうか。
>>960 自分の質問の意味を本当に理解しているか。
長さが100の配列に101個以上のデータを入れてから100個に切り詰めることはできない。
もし101個以上つめこんだらそれはバッファオーバーランであり、その結果何が起きるかは誰にも保証できない。
文字配列の長さギリギリまで文字を詰めるには、strncpyを使うこと。
CFAQ調だがいまいち
963 :
デフォルトの名無しさん :2007/02/01(木) 15:16:42
それはどーにもならないっしょ
訂正 ×strncpy ○strncat
>961の補足 strncpy()は末尾に\0をつけないことがあるので現在では好まれない strncat()で文字列を他の文字列(たとえばsrcとする)から所定の長さまでコピーするには、 data[0] = '\0'; strncat(data, src, 99); /* 100文字目は\0だから */ のようにする ファイルや標準入力から文字列を直接読む場合には、fgets()を使うこと ただし、たいてい末尾に\nがくっついていることを忘れないように なお、gets()は 絶 対 に 使ってはいけない
966 :
デフォルトの名無しさん :2007/02/01(木) 16:51:06
俺、独学で勉強してて書籍とかでgets()は非推奨的なのをすぐ知って、もう今では 使い方すら忘れてる(fgets()をよく使います)。 学校に行って勉強している(うらやましい)環境の人でも、講師からgets()を使ってどうのこうのって 教えられるの? 電気学科卒で学校で教えられたのはFORTRANだけだったけど、情報学科ってどんなんなんだろ。 情報系いっとけばよかったかな〜・・・ 以上、独り言。
967 :
デフォルトの名無しさん :2007/02/01(木) 16:55:12
>>965 通りすがりですが
data[100]の領域をとっていて30しか使わなかったら70余るから
どうにかしたいってことだからなんかちがうような
mallocoで確保して足りなくなったらreallocで再確保すればいいんじゃねぇの?
静的に確保したあとにreallocなんて使えるの?
969 :
デフォルトの名無しさん :2007/02/01(木) 17:05:35
動的確保すればいいじゃん
970 :
961 :2007/02/01(木) 17:24:59
静的に宣言した配列の長さを切り詰めたい、という発想はまったく思いもよりませんでした。
不明をお詫び致します。
>>960 どうしても配列を切り詰めなければならない理由が本当にあるのか。
もし高々数十バイトのメモリすら節約しなければならないとしたら、
そんな環境でそもそも100バイト近いURLを扱うことができるのか。
どんなものでも節約できるなら節約したほうがいいことは確かだが、
瑣末な「効率化」に目を奪われてもっと大事なことを忘れてはいけない。
どうしても必要なぶんだけのメモリを使いたいなら、静的な配列ではなくポインタを用意して、
そこにmallocで領域を割付け、必要ならreallocでサイズを変更し、使い終わったらfreeで解放すること。
971 :
916 :2007/02/01(木) 23:01:16
文字定数がintの件、こんなにレスついてどうもです。 で、なんで疑問に思ったかというと 「明解C言語入門編」で、文字を1文字として扱う部分では すべてint型で扱うようになっていて、いままでcharだと ばかり思ってたんで、ショックを受けたんです。 文字列として扱う場合はcharとかchar*が使われてるから 違和感無いんですが。 getchar()もcharを返すと勘違いしてたし・・・ C&Rからそうだったんでしょうか・・・
次スレ立ててく
はえーよ
どうせ文字定数をchar型にしようとしても、汎整数昇格がある限り、結局見た目にはint型であるように振舞うことになると思う。
いや、そのりくつはおかしい
計算を伴わないchar型同士の比較に関して、整数拡張の出る幕無いだろ?
>978 >957
>>978 規格は、オペランドの型拡張は「計算を正確に行えるもの」のうち「もっとも計算しやすい型」になると規定している。
charの値を正確に扱える型のうち、最も計算しやすい型はintである。よってchar同士の演算は、規格上は必ずintで行われる。
コンパイラが最適化を行わないなら、Cの規格に従って常にintへの変換が行われる。
コンパイラが最適化を行うなら、(コンパイラが賢ければ)文字定数がcharでもintでも同じコードが生成される。
結論として、charでなければならない積極的な理由は存在しない。
ならば値が整数である以上、整数を扱うのに最も自然なサイズであるintを使うのはごく妥当である。
規格書見たが、 >The integer promotions are applied only: as part of the usual arithmetic conversions, >to certain argument expressions, to the operands of the unary +, -, and ~ operators, >and to both operands of the shift operators, as specified by their respective subclauses. とあるから、やっぱりchar_var1==char_var2のときは適用されないんじゃないの?
あ、あほなこと言ってもた。
はい
はいじゃないが
>978 比較は実際には引き算です それと規格上intで表現できる整数は全部intになります あなたがコンパイラに何を期待しようと勝手ですが、 文字定数がcharであるべきだと主張するのは滑稽です
>>985 あなたがコンパイラに何を期待しようと勝手ですが、
比較は実際には引き算だと主張するのは滑稽です
987 :
デフォルトの名無しさん :2007/02/02(金) 08:12:58
>>986 あなたが俺に何を期待しようと勝手ですが、
セックスは実際には足し算だと主張するのは滑稽です
そーいやアセンブリ言語で比較は結果を格納しない減算命令を用いてやってたっけ。 で、Zフラグが立ったらとか立たなかったらで条件ジャンプ命令でジャンプと。 マシン語に憧れた子供時代でした、はい。
989 :
デフォルトの名無しさん :2007/02/02(金) 09:32:02
文字定数をintで扱う? ソース読みにくくするだけじゃん
function utf16to8(str) { var out, i, len, c; out = ""; len = str.length; for(i = 0; i < len; i++) { c = str.charCodeAt(i); if ((c >= 0x0001) && (c <= 0x007F)) { out += str.charAt(i); } else if (c > 0x07FF) { out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F)); out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F)); out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); } else { out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F)); out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); } } return out; }
文字定数の主たる演算対象がcharだと考える事自体偏見
993 :
デフォルトの名無しさん :2007/02/02(金) 23:30:36
埋め
^
埋め
umeume
int main(void) {
//
>>997 上手いな…ム板住民の性質をよく見抜いた、
// 埋めカキコを促す良い方法だ。
printf("埋め\n");
/* 梅
1000 :
デフォルトの名無しさん :2007/02/03(土) 20:33:57
*/ return -0721; }
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。