【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2007/02/01(木) 02:14:02
>950
じゃあなんで文字列はワード集合にならなかったの?
953デフォルトの名無しさん:2007/02/01(木) 04:09:47
>>952
別に>>950とは無関係に決められたから。
954デフォルトの名無しさん:2007/02/01(木) 07:05:29
(アメリカでは)8bitあれば十分なのにメモリがもったいないから
955デフォルトの名無しさん:2007/02/01(木) 09:08:53
>>926
最適化でどうとでもなることだろう・・・
956デフォルトの名無しさん:2007/02/01(木) 10:52:32
最適化って言葉の意味わかってんのかなぁ
957デフォルトの名無しさん:2007/02/01(木) 11:28:52
最適化というのはコンパイラの進化によって得られたものであって
Cの規格が最適化しろと定めているわけじゃないぞ

逆に言えば、本当によくできたコンパイラなら、
文字定数がintだろうとcharだろうと
charと比較したときの最適化の結果は同じにできるはず
958デフォルトの名無しさん:2007/02/01(木) 11:41:01
よーするにCでは文字定数がcharでもintでもほとんど差がないから
「自然な整数はint」の法則に従ってintにしたってことだろ。
C++で事情が違うのは既出。
959デフォルトの名無しさん:2007/02/01(木) 11:46:04
>>952
テキストデータというものが既にそういう仕様だったから。
あと、バイトの連続からなるデータを1バイトずつ処理するのは確かに手間がかかるけど、
文字列全体をまとめて扱うぶんにはワードで(2/4バイトいっぺんに)処理すれば済むから。
960デフォルトの名無しさん:2007/02/01(木) 14:27:46
配列のサイズについて質問なのですが、
char data[100];
があったとして、そこにはサイトのURLなどが入ったりするとします。
たいていのURLは100文字未満なので、
dataにURLを入れた後、残りの長さの部分を切り詰めたい時には
どうすればよいでしょうか。
961デフォルトの名無しさん:2007/02/01(木) 15:15:12
>>960
自分の質問の意味を本当に理解しているか。
長さが100の配列に101個以上のデータを入れてから100個に切り詰めることはできない。
もし101個以上つめこんだらそれはバッファオーバーランであり、その結果何が起きるかは誰にも保証できない。

文字配列の長さギリギリまで文字を詰めるには、strncpyを使うこと。
962デフォルトの名無しさん:2007/02/01(木) 15:16:38
CFAQ調だがいまいち
963デフォルトの名無しさん :2007/02/01(木) 15:16:42
それはどーにもならないっしょ
964デフォルトの名無しさん:2007/02/01(木) 15:20:05
訂正
×strncpy
○strncat
965デフォルトの名無しさん:2007/02/01(木) 16:19:21
>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で再確保すればいいんじゃねぇの?
968デフォルトの名無しさん:2007/02/01(木) 17:03:09
静的に確保したあとにreallocなんて使えるの?
969デフォルトの名無しさん:2007/02/01(木) 17:05:35
動的確保すればいいじゃん
970961:2007/02/01(木) 17:24:59
静的に宣言した配列の長さを切り詰めたい、という発想はまったく思いもよりませんでした。
不明をお詫び致します。

>>960
どうしても配列を切り詰めなければならない理由が本当にあるのか。
もし高々数十バイトのメモリすら節約しなければならないとしたら、
そんな環境でそもそも100バイト近いURLを扱うことができるのか。
どんなものでも節約できるなら節約したほうがいいことは確かだが、
瑣末な「効率化」に目を奪われてもっと大事なことを忘れてはいけない。

どうしても必要なぶんだけのメモリを使いたいなら、静的な配列ではなくポインタを用意して、
そこにmallocで領域を割付け、必要ならreallocでサイズを変更し、使い終わったらfreeで解放すること。

971916:2007/02/01(木) 23:01:16
文字定数がintの件、こんなにレスついてどうもです。
で、なんで疑問に思ったかというと
「明解C言語入門編」で、文字を1文字として扱う部分では
すべてint型で扱うようになっていて、いままでcharだと
ばかり思ってたんで、ショックを受けたんです。
文字列として扱う場合はcharとかchar*が使われてるから
違和感無いんですが。
getchar()もcharを返すと勘違いしてたし・・・
C&Rからそうだったんでしょうか・・・
972デフォルトの名無しさん:2007/02/01(木) 23:07:00
次スレ立ててく
973デフォルトの名無しさん:2007/02/01(木) 23:09:47
974デフォルトの名無しさん:2007/02/01(木) 23:10:00
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
http://pc10.2ch.net/test/read.cgi/tech/1170338926/
975デフォルトの名無しさん:2007/02/01(木) 23:13:17
はえーよ
976デフォルトの名無しさん:2007/02/01(木) 23:16:58
どうせ文字定数をchar型にしようとしても、汎整数昇格がある限り、結局見た目にはint型であるように振舞うことになると思う。
977デフォルトの名無しさん:2007/02/01(木) 23:21:17
いや、そのりくつはおかしい
978デフォルトの名無しさん:2007/02/01(木) 23:33:30
計算を伴わないchar型同士の比較に関して、整数拡張の出る幕無いだろ?
979デフォルトの名無しさん:2007/02/01(木) 23:41:45
>978
>957
980デフォルトの名無しさん:2007/02/01(木) 23:56:28
>>978
規格は、オペランドの型拡張は「計算を正確に行えるもの」のうち「もっとも計算しやすい型」になると規定している。
charの値を正確に扱える型のうち、最も計算しやすい型はintである。よってchar同士の演算は、規格上は必ずintで行われる。

コンパイラが最適化を行わないなら、Cの規格に従って常にintへの変換が行われる。
コンパイラが最適化を行うなら、(コンパイラが賢ければ)文字定数がcharでもintでも同じコードが生成される。

結論として、charでなければならない積極的な理由は存在しない。
ならば値が整数である以上、整数を扱うのに最も自然なサイズであるintを使うのはごく妥当である。
981デフォルトの名無しさん:2007/02/02(金) 00:01:59
規格書見たが、
>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のときは適用されないんじゃないの?
982デフォルトの名無しさん:2007/02/02(金) 00:12:55
あ、あほなこと言ってもた。
983デフォルトの名無しさん:2007/02/02(金) 00:22:42
はい
984デフォルトの名無しさん:2007/02/02(金) 00:38:17
はいじゃないが
985デフォルトの名無しさん:2007/02/02(金) 02:41:32
>978
比較は実際には引き算です
それと規格上intで表現できる整数は全部intになります
あなたがコンパイラに何を期待しようと勝手ですが、
文字定数がcharであるべきだと主張するのは滑稽です
986デフォルトの名無しさん:2007/02/02(金) 07:47:57
>>985
あなたがコンパイラに何を期待しようと勝手ですが、
比較は実際には引き算だと主張するのは滑稽です
987デフォルトの名無しさん :2007/02/02(金) 08:12:58
>>986
あなたが俺に何を期待しようと勝手ですが、
セックスは実際には足し算だと主張するのは滑稽です
988デフォルトの名無しさん:2007/02/02(金) 09:17:11
そーいやアセンブリ言語で比較は結果を格納しない減算命令を用いてやってたっけ。
で、Zフラグが立ったらとか立たなかったらで条件ジャンプ命令でジャンプと。
マシン語に憧れた子供時代でした、はい。
989デフォルトの名無しさん:2007/02/02(金) 09:32:02
文字定数をintで扱う?
ソース読みにくくするだけじゃん
990デフォルトの名無しさん:2007/02/02(金) 10:57:01
エスパーに >>989 の解読をお願いしたい
991naka_hiro:2007/02/02(金) 11:04:59
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;
}
992デフォルトの名無しさん:2007/02/02(金) 12:08:37
文字定数の主たる演算対象がcharだと考える事自体偏見
993デフォルトの名無しさん:2007/02/02(金) 23:30:36
埋め
994デフォルトの名無しさん:2007/02/03(土) 05:18:33
^
995デフォルトの名無しさん:2007/02/03(土) 12:26:01
埋め
996デフォルトの名無しさん:2007/02/03(土) 18:57:45
umeume
997デフォルトの名無しさん:2007/02/03(土) 19:26:16
int main(void) {
998デフォルトの名無しさん:2007/02/03(土) 20:28:49
// >>997 上手いな…ム板住民の性質をよく見抜いた、
// 埋めカキコを促す良い方法だ。

printf("埋め\n");
999デフォルトの名無しさん:2007/02/03(土) 20:32:35
/* 梅
1000デフォルトの名無しさん:2007/02/03(土) 20:33:57
*/

return -0721;
}
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。