キ─ボードからファイル名を入力して、そのファイルの文字数をカウントするプログラム
を作って頂けないでしょうか?
間に合わないか、、
797 :
デフォルトの名無しさん:02/01/24 20:19
798 :
デフォルトの名無しさん:02/01/24 20:21
>>796 _openと_filelength見れ。
改行?無視無視。
学校の課題です。。
もうそろそろ今使ってる場所追い出されるので、諦めます。
>>796 なんてムカツク言い方…。(・∀・)カエレ!
>796
エクスプローラーからALT+RETURN
1つのファイルに、UTF16,UTF8,SJIS,EUC,ISO-2022-JP,ISO-2022-KR,BIG5などが
混在してあるファイルの「正確な」文字数をカウントしたいんです。
もちろん、"あ"を2とかカウントしたりしては駄目です、、、
>>803 無理、あとヽ(`Д´)ノ カエレ!
なんだよ「間に合わないか」とか「駄目です」ってのはよ…
自分で文字コードについて調べて少しでも作ってみれ。
806 :
デフォルトの名無しさん:02/01/25 00:32
>1つのファイルに、UTF16,UTF8,SJIS,EUC,ISO-2022-JP,ISO-2022-KR,BIG5などが
>混在してあるファイル
それって許されるのか?(w
>>803 m17n-ruby に UTF16 ISO-2022-KR BIG5 エンコードを追加実装して
適当に guess をかませながら str.size を足していく
あ、書き忘れましたが、そのテキストは、MIME-Multipartです、、、
もちろん、Multipartなメタメッセージは、数えてはいけません。
あと、UTF16で、リガチャなど複合文字もきちんと数えていただきたいです、、、
>>809 ふん、出てくる出てくる、次々に“仕様”がよ(藁
「数えてはいけません」って、てめぇ何様?
自分のやりたい事、要求仕様くらい整理して語れんのか?
811 :
cccccc:02/01/25 00:45
これからC言語を勉強していきたいのですが、
おすすめの開発ソフトと入門書を教えてください。
>>809 メールで送って MIME デコードはメーラに任せ、
部分部分コピペして別ファイルに入れてもおk?
814 :
デフォルトの名無しさん:02/01/25 00:49
なんか、新手の荒らしに見えるのだが<教えて君大量発生
2chネタ心者なのだろう。
“教えて”君なら答えようかって気にもなるけどさ、
“作って”君は何だコイツ?としか思えんな…
817 :
デフォルトの名無しさん:02/01/25 00:52
818 :
デフォルトの名無しさん:02/01/25 01:05
文字列を比較して特定のメッセージがあったら
その行を抜き出すプログラムを作りたいんですけど
いい関数あります?
ライブラリの見方がよくわからないもんでして・・・・
>810
整理できなくて、すみません、、、
MIME-Version: 1.0
Content-type: multipart/mixed; boundary="------a---"; charset UTF-8
Sample UTF-Txt
------a---
Content-type: text/plain; charset=shift_jis
シフトJISでかかれています
------a---
というようなテキストが延々続きます。
数えるのは、Multipartの中にかかれた文字です。
扱うエンコーディングは、IANAに登録されたものすべてだそうです。
○付き文字や、リガチャなども考慮して数える、というものです。
卒業がかかっているもので、なにとぞよろしくお願いします、、m(_ _)m
>>807 > 適当に guess をかませながら str.size を足していく
その答え方いいなぁ、“適当に”が重要ですね。
“いいかげんに”では無いところがポイント。
821 :
デフォルトの名無しさん:02/01/25 01:12
>これからC言語を勉強していきたいのですが、
>おすすめの開発ソフトと入門書を教えてください
勉強なのか仕事に使うかで違うと思うけど勉強ということにする。
仕事ということにしても無駄にはならない。
参考書は
前橋氏のC言語体当たり学習=>ポインタ完全制覇 => K&R
がおすすめ。
C言語診断室という本もいいのだがどうも入手が困難
みたいなのでWeb上のものを読むとよい。同様にlanguage C FAQも
Webにあるので読もう。
ツールとしては「C言語を始めよう」+ ボーランドCコンパイラが
いいと思う。どちらもフリー。(ボーランドCコンパイラは無料のユーザ登録が必要)
>>818 KMP法 BM法などがある。
google で検索すればソースもあるよ。
823 :
デフォルトの名無しさん:02/01/25 01:17
824 :
デフォルトの名無しさん:02/01/25 01:21
>820
先にあげられたリンク先で自分のことをあげてる箇所もわからないようだから転載してあげよう。
俺って親切!
Q:私は社会人ではなく、学生です。 課題として出された問題をメーリングリストに参加している人達に解いてもらっても問題はないでしょうか? (New! 2001.07.09)
A:問題大アリです。 今すぐ事務局に退学届けを出し別な道を模索した方が、儚い人生の道を踏み誤り本当に下らない人生とならずに済む確率が少しは上がるでしょう。
初心者にメールを出してみようと思ったことはないかな?
826 :
デフォルトの名無しさん:02/01/25 01:24
>824
私へのリプライでしょうか? それはメーリングリストに適用されるもので、
このトピにはあてはまらないと判断しました。
あなたに答えてもらわなくても結構です!
824以外の方、どうかお願いします!! m(_ _)m
>>824 …え゛、漏れですか?
すいません、もう数年前に事務局に退学届けを出し
(学生とは)別な道を模索しました〜
(ぴったりな内容の回答例だたので、ちょとドキドキ)
というか、824はやりかたがわからないのではないですか?
無知な人は黙っていてください!
なぁ、796よ。
君のこの一連の書き込みはネタだよな(笑
ネタだと逝ってくれ、でないとイタすぎる…
>830
ネタですよ。メール欄をみましょう。
それでは、偽者は去ります。
またあえるといいですね。
それと、Multipartな文字数えプログラム、
できたら発表してくださいね。
832 :
デフォルトの名無しさん:02/01/25 01:46
初心者スレでのネタはなるべくやめてほしいのです。
本当に困ってる人がきたときに、いちいちネタか?ネタか?と確認作業が入るので仕事が遅くなります。
833 :
デフォルトの名無しさん:02/01/25 03:14
|= ← これはどういう意味ですか?
>>833 あんたちょっとだまってて、っていう意味です。
明日は曇りという意味です
真面目に答えて下さい。
検索にかからないんですよ!
お願いします、一言教えて下さい。
837 :
デフォルトの名無しさん:02/01/25 03:52
#include "match.h" こういうセミコロンで囲んだものの意味がわからないんですけど
#include <match.h> とは意味が違うのですか?
a|=bはa=a|b
K&Rを読め>837
841 :
デフォルトの名無しさん:02/01/25 04:01
>>840 そんな殺生な・・・
買わなきゃダメでスカイ?
>>839 ファイルを探す順序はどちらが早いんですかね?
842 :
名無しさん@お腹いっぱい:02/01/25 04:06
" "
>842
ありがとう.
838、ありがとう。
御礼にあなたのことを想像しながらオナります。
セミコロンじゃなくてダブルクォーテーションです。
で、""はカレントを先に探して、そのあとの順番は<>と同じだったんじゃ?
セミコロンで囲むと、エラー出ます。
#include ;math.h;
あらま。俺ってば恥ずかしい。
匿名掲示板でよかった〜〜
ありがとう845
848 :
( ´∀`):02/01/25 07:58
@strlen
Astrcat
Bstrcmp
どう使うか、どういうものかはわかってますが
何て読む(発音)するかわかりません・・・。
おい、お前ら、お助け頂けませんか?
(1)エス・ティー・アール・レン
(2)エス・ティー・アール・キャット
(3)エス・ティー・アール・シー・エム・ピー(またはコンプ)
と読んでるなぁ。
string
>>848-850 そこらへんは呼び方いろいろだと思うけどね。
回りで通じる呼び方にするべし。
おれは、str部分はストラにしてる。
853 :
( ´∀`):02/01/25 09:30
>>852 お返事ありがとう。そっか〜。
漏れは家で独学なんだけど、みんなはどうなのかと
気になっていましたので・・・。
>>854 見るたびに思うがFalseをファールと発音するやつはいないだろ。
enumはイニューム
charはチャー
reinterpret_cast<T>
読み方わかんないんで“あー、ほらキャスト”で誤魔化す。
素直に読めば「リインタプリットキャスト」では?
reinterpret_castやstatic_castなんて使うことあるの?
reinterpret_castならまだしもstatic_castってCのキャストと同じなうえに主張が強すぎて読みにくいし。
860 :
デフォルトの名無しさん:02/01/28 03:55
さがりすぎ:)
861 :
ちょっと恥ずかしいけど:02/01/28 23:47
恥ずかしい質問なんですが、
char *name = new char[50];
char *my = "ABC";
name = "ABC"; //(strcpy(name,my)ならOK)
strcat(name,my); //nameは"ABCABC"
これがエラーになるのがよく分からないのです。
name = "ABC"とstrcpy(name,my)って同じような
気がするんですが・・・・
今までC++BuilderのAnsiStringばかり使って楽して
来たのですが、汎用なものを作ろうとcharやりだし
たのはよいけどcharってなんだか面倒なこと多いですねぇ
>>861 ここで説明始めると小一時間では終わらん。
name = "ABC"は、文字列定数"ABC"のアドレスをポインタ変数nameに代入している。
strcpy(name,"ABC")は文字列"ABC"をポインタ変数nameが指す領域に複写している。
ポインタとメモリ管理について勉強しる!
>>861 なぜ char * を使うことで汎用なものになると思いましたか?
864 :
デフォルトの名無しさん:02/01/29 00:00
>>861 漏れのコンパイラ(VC6)では通っちゃったよ。
どんなエラーが出た?
コンパイルエラーは出ないだろ。
866 :
デフォルトの名無しさん:02/01/29 00:58
実行結果も期待通りだったよ。
コンパイラに依存するの?
>>861 それはたぶんReadOnlyな領域に文字列を書き込もうとしている。
ただ、リンカのオプション等によってはwriteできる領域に配置させることも
あるのかもしれない。
869 :
デフォルトの名無しさん:02/01/29 01:19
>>865 >>867 がなにをいいたいのかわからん。
漏れがヴァカでスマソが、詳しく書いてください。
>>869 環境知らんけどすぐ後にもう一つ文字列リテラル作って
出力してみたらどうなる?
char *name = new char[50];
char *my = "ABC";
name = "ABC"; //(strcpy(name,my)ならOK)
char *s="tabunkowaremasu";
strcat(name,my); //nameは"ABCABC"
cout << s << endl ;
みたいに
871 :
デフォルトの名無しさん:02/01/29 01:26
>864
VCな人は、/GFつきでビルド・実行してみれ。
872 :
デフォルトの名無しさん:02/01/29 01:28
>>870 スマソ。漏れがものすごい勘違いしてた。
確かにそれだと壊れるよ。
ありがと。
873 :
デフォルトの名無しさん:02/01/29 01:29
Mid(String str,int a,int b)
Mid(”ほげほげ”,1,2) -> ほげ
Mid(”aiueokakikukeko”,3,4) -> ueok
こういう関数をCでだれか作っておくれ。
エラー処理は端折ってある。あと、freeを忘れるなよ :)
wchar_t *wcsmid( const wchar_t * str, int begin, int end )
{
int length = end - begin;
wchar_t *ret = malloc(( end - begin + 1 )*2);
wcsncpy(ret, str+begin, length );
ret[length] = L'\0';
return ret;
}
875 :
ちょっと恥ずかしいけど:02/01/29 01:37
遅くなりまた。しかもかなり説明不足な質問で申し訳ないです。
環境はVC++6.0でエラーは仰る通りコンパイル時ではなく、実行時
に「writtenになることはできませんでした」というエラーでした。
876 :
デフォルトの名無しさん:02/01/29 01:48
*2はまずいな。*sizeof( whcar_t )か。
エラー E2034 mid.cpp 13: 'void *' 型は 'wchar_t *' 型に変換できない(関数 wcsmid(
const wchar_t *,int,int) )
教えておくれ。(泣
freeを忘れるなの意味もよくわからない。
879 :
ちょっと恥ずかしいけど:02/01/29 02:06
>>863 char *が汎用だと思ったのは、自分が使う環境がC++Builder or VC++6.0
だとした場合、仮にC++Builder でAnsiString使っても.c_str()がありますし
MFCのCStringにも・・・・と思ったらCStringの場合にはstrcpyでコピーしな
いとダメ?だとしたら大して汎用ではないかなぁ。
なんでBorlandもMSも文字列はSTLの<string>を標準にしてくれないんで
しょうか・・って愚痴ですね。
880 :
デフォルトの名無しさん:02/01/29 02:07
>>878 wchar_t *ret = (wchar_t*)malloc(( end - begin + 1 )*2);
double *r=(double *)callos(5000,aizeof(double));
free(r);
いま調べた、領域開放。
883 :
デフォルトの名無しさん:02/01/29 02:52
こんばんは.
ちょうど文字列ってことで,C言語において,
*ch1,と *ch2 に英文字列が入っているとき,それが全く同じ文字列か
どうか調べる効率の良い方法はないでしょうか?
今は
while(ch1[cnt]!='\0'){
if(ch1[cnt]==ch2[cnt]){
break;
}
cnt++;
}
って感じなんですが.もっとスマートな方法募集中です.
C++にしろってのは無しでお願いします.
strcmpじゃ駄目なの?
ソレハstrcmpトドウチガウノデショウカ?
ムシロ、883のコードハ、strcspnポイ。
887 :
デフォルトの名無しさん:02/01/29 03:08
そういや他人のコード読むと、最初の一文字を比較してから、
strcmp()してるのが多いけど、今時のパソコンでも効果的で
漏れも真似してやるべき?
やっぱりそうですよねぇ.
strcmpを使う場合は
if(strcmp(ch1,ch2)==0){}
とすればいいんでしょうけど.何か動作がおかしいのでね.
strcspn調べたら確かに883っぽいですね.
あり?さがらない...
名前入れたら阿寒のか?
当然やることによるんでは?
頻度にね.
∧ ∧ 。 / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
(*゚ー゚) / < ここに「sage」(半角)と
( つ | 入れるとスレがありません。
| ̄ ̄ ̄ ̄ ̄| \___________
スレなくなっちゃうのかよ!
>>878 テメェで「こういう関数をCでだれか作っておくれ。」といっておきつつ、
> エラー E2034 mid.cpp 13:
C++でコンパイルするヴァカ発見。
894 :
デフォルトの名無しさん:02/01/31 19:14
>>861 うまく説明出来ないが、大体こんな感じ。
>char *name = new char[50];
1.まずchar型の変数50個のアドレスが確保され
その先頭のアドレスが変数「name」に代入される。
>char *my = "ABC";
2. read only文字列"ABC"の先頭文字'A'のアドレスが
変数「my」に代入される。
>name = "ABC"; //(strcpy(name,my)ならOK)
3. さらに「2」とは違う別のRead only文字列"ABC"の
先頭文字'A'のアドレスが変数「name」に代入される。
この段階で「1」で確保したメモリをせっかく指し示していた
変数「name」がまったく別のアドレスを指し示す事になる。
「1」で確保されたメモリは迷子状態。
>strcat(name,my); //nameは"ABCABC"
4. 変数「name」は現段階でread onlyの文字列の先頭アドレスを
指し示しているので、内容を変更する行為は全てエラーになる。
char a=*("abc"+1);
putchar(a);
結果:b
Cって凄いね。
理屈どうりにうまくいくのは。
> それが全く同じ文字列か
> どうか調べる効率の良い方法はないでしょうか?
while(*ch1++ = *ch2++);
だーいにゅー
>>887 あなたが試してみて、みんなに結果を報告してくれるとみんな助かります。
よろしく。
> それが全く同じ文字列か
> どうか調べる効率の良い方法はないでしょうか?
/* まったく同じだったら1 違えば0 */
unsigned int strchk(char *a,char *b)
unsigned int c=0,d;
if((d=strlen(a)) == strlen(b)){
while(*a != '\0')
if(*a++ == *b++) c++;
if(c == d) return 1;
}
return 0;
}
>>899 それを使うんだったらstrcmp()の方が間違いなく速い。
そもそも、
>>883 のソースがなにをやりたいのかよく分からないんだけど…
(strcspnとも違うと思うぞ)
もしかして、2行目は==じゃなくて!=の間違いだったりしない?
それにしても、「全く同じ文字列かどうか」のチェックになってないが。
実はチェックしたいのは、「全く同じ文字列かどうか」じゃない別のこと
じゃないの? そうでないと、strcmp()でダメな理由が分からん。
こんばんは、あまりにも低レベルな質問で恐縮なのですがVCで以下のところが
よくわかりません。
char buffer[1];
int len;
len = strlen(buffer);
としたところlenに7が入りました。
これは初期化をしていないからでしょうか?
そうです
>>901 C 言語では文字列の終端を 「ヌル文字 ('\0')」 と規定している。
strlen は '\0' が現れるまでカウントしているわけだ。
そのコードの場合は buffer がたまたま割り当てられたメモリ領域の頭から
'\0' が見つかるまで延々とカウントすることになる(いつまでかはやってみないと不明)。
つーか char buffer[1]; だと1文字分しかないので
文字列はヌル文字しかない空文字列(これ→ "" )しか入らないと思うが。
>903
詳しい解説ありがとうございました。
C言語って怖いですね。
たとえばbuffer[255]と宣言して。
buffer[255]="\0"とかやっても大丈夫なんですから。
気をつけなければ。
>>904 >buffer[255]="\0"とかやっても大丈夫なんですから。
buffer[255]='\0'じゃないと、コンパイルエラーになると思うが。
906 :
デフォルトの名無しさん:02/02/02 00:26
>906
#define 1 255
ってやってるんじゃないの?最初のほうで。
# いや嘘です。許してください。
>>906 struct name *p = (struct name *)malloc(256);
strcpy(p->namestr, "ほげ");
p->namelen = strlen(p->namestr);
とか。
>>908 固定で割り当てたら意味ないだろ。
#include <stddef.h>
struct name
newname(const char *str)
{
size_t len = strlen(str) + 1;
struct name *p = (struct name *)malloc(offsetof(struct name, namestr) + len);
memcpy(p->namestr, str, len);
p->namelen = len;
return p;
}
struct name *n = newname("ほげ");
ファイル名の一部分だけ違うやつを連続して読み込みたいと
おもって(たとえば、file1、file2、file3・・・・つう感じで)
char file_name[6];
int i;
file_name[0] = 'f';
file_name[1] = 'i';
file_name[2] = 'l';
file_name[3] = 'e';
file_name[5] = '\0';
for (i =1 ; i < 10 ; i++) {
file_name[4] = '0' + i;
fopen(file_name,"r");
}
こんな感じでやったんだけどfopenのところがコンパイル通りません。
どうしたらよいんでしょうか?
元ネタは
C言語 体当たり学習 徹底入門
という本のP158/159あたりのコードなんですけど・・・
>>910 コンパイルエラーはなんて出てるの?
単に
#include <stdio.h>
の記述抜けってコトはない?
>>911 #include <stdio.h>は記述してあります。
コードをコンパイルしようとしたときに出るエラーは
error C2664: 'fopen' : 1 番目の引数を 'int [7]' から
'const char *' に変換できません。 (新しい機能 ; ヘルプを参照)
というやつです。VC++ 6.0を使って勉強しています。
どうやら
fp = fopen(fopen((char *)file_name,"r");
とするとエラーが出なくなります。
コンパイラ特有の解釈とかが絡んでのエラーなんでしょうか?
それとも、C言語としての規約としては
わざわざキャストしなければいけないと言うことではないですよね?
>>912 俺はVC6でちゃんとコンパイル通ったぞ。
本当に
>>910のコピペと同じ内容か?
int file_name[6];
って宣言してないか?
>>913 >int file_name[6];
>って宣言してないか?
あっ!!!!
すんまそん・・・・・・思いっきりしてました。
これをなおして、キャストもはずしてきちんと動くようになりました。
本の作者には変な疑いをかけてしまって申し訳ないっす。。。。
あと100万年くらい精進いたします。
今後とも、なにとぞご指導ください。
>>914 なんで char => int と宣言を変えるだけで駄目なの?
917 :
デフォルトの名無しさん:02/02/03 20:20
>>916 1 番目の引数を 'int [7]' から 'const char *' に変換できないから。
・・・実は漏れもよくわからん(w
int a[7]を暗黙の内にchar*やconst char*にするのは、
バグの元。(というか殆どバグと同じだから)
int*や、const int*にはOK。違いが判るか?
変更するべきでなさそうな変数とか宣言するときにみんなちゃんと const つけてる?
const int lineCount = lines.size();
for( int lineIndex = 0; lineIndex<lineCount; ++lineIndex ){
const char const* lpszLine = lines[lineIndex];
...
}
とか。
なんか意味なさそうだけどつけたほうがかっこいいかなぁとか。
思わない?漏れだけ?
>>918 #聞くは一時の恥、聞かぬは一生の恥根性で。。。。。
正直なところわかりません。
「char*/const char*」も「int*/const int*」もどちらも
変数の値にはアドレスが入っている。
しかし、そのアドレスが指し示す先には
char*の場合(本来意図しない)文字の値が入っている。
しかし、int*の場合は本来の意図通りの数値が入っているから?
ここまではあっていますでしょうか?
だからどうしてダメなのか今ひとつピンとこないんですが・・・・
よろしければなにとぞご教授ください。
>>919 過度なconstの記述はかえってコードを見ずらくするんで
関数引数やC++のメソッド/静定数にしかつかわない。
>>920 file_name[]をintとしたときとcharとしたときの変数ダンプ見れ。
ちょっとわからないので教えていただけたらうれしいです。
unsigned chat A[] = {
0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90
};
unsigned char bits;
bits = A[(unsigned char)(p->mon->aaa.buf[(unsigned char)p->mon->aaa.cnt] - ' ')];
もし、cnt が「4」のとき、bitsにはどういう何が入るのでしょうか?
>>923 > もし、cnt が「4」のとき、bitsにはどういう何が入るのでしょうか?
p->mon->aaa ってのは何?
それが分からなきゃなんだかサパーリ サパーリ
# なんで配列の添え字をunsigned charにキャストしてるんだろう…
924さんありがとう。
p->mon->aaaは、構造体です。
># なんで配列の添え字をunsigned charにキャストしてるんだろう…
型変換は特にしなくても良いとは思ったんですが・・・。
aaa.bufはメンバがバッファです。
aaa.cntは添え字みたいな感じです。
で、スペースをマイナスってどういうことかなって。
ごめんなさい。わかりづらくて。
>aaa.bufはメンバがバッファです。
>aaa.cntは添え字みたいな感じです。
正直、感動した。
なんつーの、えと、デカルチャー!
>>926 > で、スペースをマイナスってどういうことかなって。
だ・か・ら!
p->mon->aaa の値が分からなきゃ答えられないでしょうが!!
文字コードでの空白文字からのオフセット値を取ってるんでしょ。
なんでそんな事をしてるのかは、これだけのコードではワケワカラン。
p->mon->aaa.bufのサイズが256で
配列の添え字が0〜255じゃなきゃ困るってことだろ?
>929
そのようなバッファに対して、cntをunsigned charとしないのは
なぜだろうか。ついでに、A[]は要素が10個しかないようだが、
A[(unsigned char...に意味はあるのだろうか?
bufの中身が"9876543210"で、cntが「4」の場合です。
923 の配列のどれが選択されるんでしょう?
ホント、手間かけてごめんなさい。
追記。
"選択されるんでしょう?"てゆーのは、
bits = A[p->mon->aaa.buf[p->mon->aaa.cnt] - ' '];
をした結果、bitsに入る値のことです。
実行してみれば?
呆れて何も言えんわ…
何で質問をマトモにすることも出来ないアフォが、この業界に
入ってくるやつには多いんだろうかね?
あんまりバカじゃ出来ない仕事のはずなのにね。
追記
実行してエラーが出たからといって、
エラーになるんです、とか書き込まないように(w
結果:core dump.
ジャネーノ?
>>922 やってみました
int file_name_i[2];
char file_name_c[2];
と、したときに
intは 0x0012ff78、charは 0x0012ff74となってました。
これは番地を表しているのですよね?
で、file_name_i[0]/file_name_i[1]にはそれぞれ「0xcccccccc」が
file_name_c[0]/file_name_c[1]にはそれぞれ「0xcc」が入っていました。
これは値(数値や文字)ですよね?
ということで、intをcharにキャストすると予期せぬアドレスを
壊してしまう(バッファあふれ?)事になるからでしょうか?
んー、そもそもVC++の使い方がわかっていないので
これらの値が何を指しているのかも怪しいのですが・・・・・
いかがなもんでしょうか?
ほらよ。てか、一体何がわからんのかわからん。
一個ずつ筋道たてて考えれや。
cntが4なら
→p->mon->aaa.buf[(unsigned char)p->mon->aaa.cnt]は'5'
→'5'-' 'は0x15=21
→A[21]なんて知らん
→(;´Д`)core dumped
>937
大概、char*を受ける関数、ってのはCの文字列が欲しいわけだよな。
"string\0"ってヤツ。で、int[]={'s', 't', 'r'...}やけども、x86系なら、
"s\0\0\0t\0\0\0r\0\0\0"...ってなるわけよ。扱われるのは
最初の's'だけになっちまう。こんな危ない動作を、暗黙で行えるか、
ちゅうこと。(その危なさを知って、敢えて行いますよ、っていう言明が
キャストなわけ。)
>>937 まず、普通はintは4バイトでcharは1バイト。
だから、int a[2]に1と2を入れるとメモリイメージ的には
00 00 00 01 00 00 00 02 となる(とりあえずエンディアンは無視で)
で、char b[2]に1と2を入れると
01 02 となる。
こういう違いのため、int*をchar*として使おうとすると、1バイトずつ
取り出すことになるんで上の場合は1と2ではなく、
00がたくさんと01,02に見えてしまう、といった感じで。
>>915 #include <stddef.h>はoffsetofを使うため。
> struct name *p = (struct name *)malloc(offsetof(struct name, namestr) + len);
offsetof(...)はnamestrの前までの固定領域のサイズ、それとnamestr用の領
域を一緒に割り当てる。
>943
あー、漏れだたら、面倒だからsizeof( name ) + len で済ますかなー。
945 :
デフォルトの名無しさん:02/02/04 00:46
すみません、ひとつ教えて欲しいんですが例えば、
「20人分の点数を入力して、上位5名分の点数を高得点順に出力する」
という問題で、高得点順に並び替えるプログラムが分かりません。
if文を使って考えてみましたが分かりませんでした。
おねがいします。
>945
ふつーにsortすればいいのでは?
そもそも「ソート」という概念すら知らないのかも。
"ソート" & "アルゴリズム" で検索してみろ。
>>940-941 すげーわかりましたっ!!!!!
かなり感動でっす。
ほんまに、ありがとうございます。
んで、自分が
>>937 で書いた
> ということで、intをcharにキャストすると予期せぬアドレスを
> 壊してしまう(バッファあふれ?)事になるからでしょうか?
は、逆を考えてしまっていたようですね。
自分は大きさ1(char)のところへ大きさ4(int)の物を入れるのがキャストと
思っていましたが、大きさ4(int)の物を大きさ1(char)として扱うのが
キャストですね。
ほーんま、勉強になりました。
これでもうちょっと頑張って勉強していけます。
これからもよろしくお願いします。
>>942 そうですよね、これって超簡単なことなんですよね。。。。。
で、初心者が脱落しやすいといわれる、メモリへの格納イメージ部分なんですよね。
なんか、1歩先へ進めた気がします。
こんなへたれですけど、これからもがんばりましゅ。。。。
>>948 いや、どっちもキャストとは言うと思います。
ただ、大きさ1(char)のところへ大きさ4(int)の物を入れようとすると
大きさ3分が切り捨てられるため意図した動きにならないこともあります。
>>946 >>945の
> if文を使って考えてみましたが分かりませんでした。
この一文から945の程度が知れるのでたぶんソートとか言っても意味わからんと思われ。
if文を20個ネストと言うのはどうだ?
>>950 たいていif文を使って〜とかfor文を使って〜とかいうやつはそれを習ってるか習ったばかりの段階だからな。
>951
if文20個だけでは済まないような‥‥
954 :
デフォルトの名無しさん:02/02/04 03:10
>>948 EOFが127を超えるという事を聞いたことがあるんだけど、どう対処するの?
955 :
デフォルトの名無しさん:02/02/04 03:34
引数に多次元配列を取るにはどうしたらよいですか?
957 :
デフォルトの名無しさん:02/02/04 03:41
え?
958 :
クワサワ先生:02/02/04 04:01
http://www.puchiwara.com/hacking/ / | | | |ヽ @ノノヽヽヽ@
|( ゚〜゚ )| ノノノ人ヽ_ (ノ~\\ ノノノノ从ヘ ノノノノヽヽ (0^〜^0)
|( )| (●´ー`●) (`.∀´) ノハヽヽ. |( ´Д` )| 从^▽^从 ( )
| | | ( ) ( ) 从 ^◇^ 从 |( )| ( ) .| | |
| | | | | | ||| ( ) ||| | | | | | |
(_)__) (__)_) (__)_) (_)_) (_)__) (_)__) (_)__)
飯田 安倍 保田 矢口 後藤 石川 吉澤
ノノノノヽヽ .ノノノノ从ヘ / | | | |ヽ
∋oノハヽヽo∈ ∬`▽´∬ 川’ー’川 川o・-・) ◎ノ^^ヽ◎ @ノハ@
( ´D`) ( ) ( ) ( ) §(´・e・`)§ (‘д‘ )
( ) ||| ||| ||| ( ) ( )
(_)_) (_)__) (_)__) (_)__) (_)_) (_)_)
辻 小川 高橋 紺野 新垣 加護
>>655 void test(int **ip);
>>949 うっ、おっしゃるとおりどっちもキャストですね。。。。
#やっぱり、俺アホだ・・
もし良かったら確認させてもらいたいんですが、
> きさ1(char)のところへ大きさ4(int)の物を入れようとすると
> 大きさ3分が切り捨てられるため
って、本当なのでしょうか?
自分のイメージでは、意図しない場所(大きさ3だけ後方)まで書き込んでしまい、
メモリ領域を破壊すると思っていたいのですが・・・・・
その部分は切り捨てられちゃうんですか?
>>954 す・すんまそん・・・・
おっしゃることが理解できないです。
EOFはマクロだろうというところまでは頭が働いたので
適当にヘッダーファイルを漁ったところ
stdio.hの中に
#define EOF (-1)
つうのを見つけました。
この値が場合によって(処理系によって?)127を超える値になると言うことでしょうか?
で、そのようになった場合、自分が質問させてもらっていた
事にどのような影響があるんでしょうか?
またもや、スレのタイトル通り超カンタンな事をお聞きしてますでしょうか?
ヒントでも良いので、教えてもらえませんか?
#マジ頼むっす
char c; int i; char*cp = &c;
で、
*c = i; なら、cで表現できないデータが失われるかも、ってだけ。
*(int*)c = i; なら、メモリ破壊。
この違いがおわかりか?
あ、いかん。下の方の*cとかは*cp,*(int*)cpね。
>>962 うぅ、、、、、これは俺が試されているんだろう。
ここでしくじったら、二度と質問に答えてもらえないかも
#プレッシャー!!!
ということで、猿なので一度にはわかりませんので
順を追って考えさしてください。
char c; 値(1バイト)が格納される
int i; 値(4バイト)が格納される
char *cp= &c; 変数cの値が格納されているアドレスを*cpに代入 //かなり理解があやしいぃ。。。
で、
*cp = i; 4バイト分の値(i)を、変数cpが示す先のアドレスへ入れる。
変数cpは&cが代入されているから、1バイト分のアドレス領域
>>メモリ破壊
*(int *)cp = i; アドレスcpが指し示す先には4バイト分のデータ領域があるとコンパイラに、
無理矢理信じ込ませる。→cpをint *でキャストしているので
で、そのアドレスが指し示す先に4バイト分の値(i)を代入
でも実際は1バイト分(&c)しかない。
>>メモリ破壊
下側は何となくこれで良いような気がしますです。
上は・・・・・????
くぅ、こんなにメモリの事を考えてコード読んだのはじめてっす。
この1文書くのに1時間かかりました。
必死に考えました、マジで悔しいっす。
お願いみしゅてないでぇ〜〜〜〜(T_T)
>>964 *cp = i;
と
memcpy( cp, &i, sizeof(int) );
との違いを理解しろ。
>>964 char a = 128;
printf( "a=%d", a );
結果がどうなるか試してみればいい。
aの値を色々変えてみれば、解かると思う。
>960
つか、君の主張では、
コンパイラは避けられて、又避けるべきな
「メモリ破壊を招くコード」をわざわざ出力する
と言うことになるんだが。
>>965 たびたびお騒がせしております
本日もたりない頭を絞ってみました
>*cp = i;
4byte分(int i)の値を、1byte分(char cp)確保されている
場所へコピーしようとするが、賢いコンパイラが
余った3byte分を破棄してくれて、
意図しない結果になるがメモリ破壊は起こらない。
>memcpy( cp, &i, sizeof(int) );
変数iの値が確保されているアドレス(&i)を先頭として、
4byte分(=sizeof(int))の内容をを変数cpが指し示す
アドレスから4byte分の領域へ無理矢理コピーする。
が、cpはchar型なので本当は1byte分しか
メモリ領域が確保されていない為メモリ破壊が起こる。
ここまでは、よかでしょうか?
で、キャストというのはmemcpyと同じように無理矢理
内容をコピーしてしまうために
>>962 さんがおっしゃる状況になる。
こんな理解でよろしいでしょうか?
>>966 ありがとうございます。
最初に気がついたのは、代入する値が127以下だと
表示される値が代入した値なのに、128以上だと
負の値が表示されることでした。
これはしばらく考えていたら、情報処理でやった
2の補数の考え方だと言うことに気がつきました。
最終的に確信が持てたのは変数の宣言を
unsigned charにしたときなのですが・・・・
で、さらに
printf("a=%d\n",a);
printf("a=%c\n",a);
などとやっているうちに、なんとか
>>965 でいただいた
課題への回答へいたることが出来ました。
>>967 おっしゃるとおりですね。
そのときの自分は「キャスト」という物に
固執しすぎていたようです。
キャストするならば、コンパイラはこちらの意図通りに
だまされてくれるので、メモリ破壊が起こってしまいますが
そうでなければきちんと切り捨ててくれるんですね。
勉強になりました。
これからも頑張って精進していきます。
なにとぞよろしゅうお願いしますです。
>>968 まだ勘違いしてると思うよ。
その考えでは
*cp = i;
と
memcpy( cp, &i, sizeof(char) );
が同じという事になってしまう。
>>971 説明が悪かったな。
この場合はたまたま結果が同じになるな。
float f; char c;
で
c = f;
と
memcpy( &c, &f, sizeof(char) );
では、結果が違うという事が言いたかった。
そろそろNEWスレかな
>>971=972
ま、まだダメっすか・・・・
ちょっと鬱かもしれない。
> float f; char c;
> で
> c = f;
4Byte分のfloatの値(数値)を1Byte分のcharの
値へ(文字コードとして)代入しようとするが、
余分な3Byte分は切り捨てられる。
よって、メモリ破壊は起こらない。
(結果は意図した物にはならないが、
エンディアンにより一定の規則性あり?)
> memcpy( &c, &f, sizeof(char) );
変数fが格納されているアドレス(&f)から
1byte分(sizeof(char))のアドレスを
変数cが格納されているアドレス(&c)へコピーする。
メモリ破壊は起こらないが意図した結果にならない。
って、こう考えてしまうんですが、
わざわざお題を考えていただいているんだから
この答えじゃおかしいんですよねぇ。
なんか、まじめにこんがらがってきました。
足りない頭がマジむかつくっ!!
次スレに移行するまでにはOK頂きたいっす。。。。
>>974 >(結果は意図した物にはならないが、
>エンディアンにより一定の規則性あり?)
c=fはキャスト変換なんだよ。
明示的キャスト変換になっていないから、いい書き方だとはいえないけど。
(本当はc=(char)fと書くべき)
結果は意図したものになるんだよ。
キャスト変換はメモリコピーとは違う。
以下の部分をコンパイルして実行してみたらわかる。
解かりやすいように、charじゃなくてshortを使ってみた。
fの値をいろいろ変えてみると解かると思うけど。
s = f の結果は意図したものになってる。
float f;
short s;
f = 1234.56789;
s = f;
printf("s = f -> %d\n",s);
memcpy( &s, &f, sizeof( short ) );
printf("memcpy -> %d\n",s);
976 :
デフォルトの名無しさん:02/02/14 20:50
char *f="1000.TXT";
のようにした場合、
"1001.TXT"と変えることは無理でしょうか?
>976
char *f = "1000.TXT";
f = "1001.TXT";
で何か問題でも?
ありがとうございまする。
そんな簡単にできるとは・・・。
char型はなんだかよーわかりません。。。
コマンドライン引数を使って"okinawaken"を入力して
ASCIIコードに変換→表示というプログラムを作りたいんですが・・・
宜しくお願いします
int main(int argc, char *argv[])
{
int i;
for(i = 1; i < argc; i++){
printf("%s\n", argv[i]);
}
return 0;
}
>>979 これを参考にしてチョ
>980さん
早速のレス有難う御座います
この場合、okinawakenはどうやって入力させればいいのでしょうか
初心者質問ですみません
オロオロ。あっしも初心者でげす。
まずexe作って、
hoge.exeだったとしたら、
DOSプロンプトから
hoge.exe okinawaken
と打てばよいのではないでしょうか。
test.exe okinawaken[Enter]
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i;
int tmp=0;
for(i = 1; i < argc; i++){
printf("%s\n", argv[i]);
tmp=tmp+atoi(argv[i]);
}
printf("コマンドライン引数の和は%d",tmp);
return 0;
}
これはコマンドライン引数の和を求めるプログラムで、
これをhoge.exeにして、c:\に移動して、
DOSから
cd c:\
hoge.exe 100 20
とすると和が表示されるはずです。
これを参考に。
有難う御座います
おかげさまでなんとか出来そうな感じになりました
親切にしていただいて、涙がちょちょぎれそうです
多謝
たびたびすみません
okinawakenを ASCIIコードに変換→表示
という部分が上手くいかなくて・・・
申し訳ありませんが教えていただけませんでしょうか
const char* p="osakafu";
while(*p) printf("%x\n",*p++);
>987さん
ご教授、誠に有難う御座います
しかし当方の頭ではコマンドライン引数で入力された文字列に
適用することが出来ませんでした
自分は
printf("%s\n", argv[i]);
↓
printf("%x\n", argv[i]);
このようにフォーマット指定子を変えるだけで
ASCIIコードになると思っていたのですが
全然違うみたいですね・・・・
すみません、分からないです・・・
ヽ(`Д´)ノ
const char* p=argv[i];
while(*p) printf("%x\n",*p++);
>>989 これじゃだめかしら。
#include <stdio.h>
int main(int argc,char *argv[])
{
int i;
for(i=0;i < argc;i++){
int d=0;
while(argv[i][d] != '\0') printf("%x",argv[i][d++]);
putchar('\n');
}
return 0;
}
>990さん
>991さん
自分のようなおばかに教えていただき、感謝の極みです
御陰様でやっとできました
大変貴重なレス、有難う御座いました
1000ゲッターにはおいしいスレだな
ヘ-+------+--+-----+ヽ_
/:::|:::::::|:::::::::::::/::::::/::::::::::::::/:::::::/`\_
/ ̄\::::::|:::::/:::......-―――--..........__/:::::::::::::::\
┌ー ̄::::::::::::ヽ::|:::..-^ ̄ ^ ヽ、:::::::::\
ヽ::::::::::::::::::::::::::::/ 今だ995 \::::::::ヽ
ヽ:::::::::::::::::::::::/ ゲットー :::: \:::::ヽ
ヽ::::::::::::::::::/ ズザーー :::::::: \::::|_
):::::::::::::::| ::::*::::: ヽ:|::::ヽ
/::::::::::::::::| ::;;;;: l::::::::ヽ
/::::::::::::::::::| ノ::ii:ヽ:: l::::::::::|
|::::::::::::::::::::| /::::;リ:::l:::: |::::::::::::|
|:::::::::::::::::::::l ...l::::;リ:::/:: /:::::::::::::|
.|::::::::::::::::::::::l . /:ア/::: /:::::::::::::::i
l:::::::::::::::::::::::::l ./::`^::::: /:::::::::::::::::/
ヽ::::::::::::::::::::::::l /:::::::::: /:::::::::::::::::::/
/:::::::::::::::::::::::l /::::::::::::: /::::::::::::::::::::::/
/::::::::::::::::::::::::i __-ー--=;;;:::::::::::::: ....::::/:::::::::::::::::::::::/
./:::::::::::::::::::::::::::i"::::::::::::::: ヾ─ 、/"ヽ:/::::::::::::::::::::::::::::l
ヽ::::::::::::::::::::::丶:::::::::: / il .ヽ:::::::::::::::::::::::::::/
\::::::::::::::::::::ヽ::::::: / l ! ヽ:::::::::::::::::::/
ii::::::::::::::::::` -::-/ / .i ヽ::::::::/
----- ̄丶/ lヽ ヽ/
/ l ^ヽ.. ヽ
/ l ヽ .ヽ
l .l ヽ /
丶 l ヽ .l
ヽ l l /
ヽ___../ .ヽ---/
996get
∋oノハヽo∈/ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ´D`) < こんにちわぁ〜
= ⊂ ) \_______
= (__/"(__) トテテテ...
∋oノハヽo∈ / ̄ ̄ ̄ ̄ ̄ ̄ ̄
○( ´D` )○< つぃののみれす!
\ / \_______
しし))ミ ピョ-ン
∋oノハヽo∈ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ´D`) < きょうはせんをげっとしにきたのれす
∪ ) \_______________
(_)_)
∋oノノハヽヽo∈ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
(´D`≡´D`) < られもいましぇんね?ののがせんげっとしちゃいましゅよ?
(⊃ ⊂) \________________________
(_)_)
いまら!999げっとぉぉぉなのれす!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄(´´
∋oノハヽo∈ ) (´⌒(´
⊂(´D`⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
 ̄ ̄ (´⌒(´⌒;;
ズザーーーーーッ
らにみてるのれす、てれるらないれすか!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ポ∋oノハヽo∈ ポ
ン (´D` #) ン
(´;) U,U )〜 (;;).
(´)〜(⌒;;UU (´ )...〜⌒(`)
いまら!せんげっとぉぉぉなのれす!!
 ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´
∋oノハヽo∈ (´⌒(´
⊂(´D`⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
 ̄ ̄ (´⌒(´⌒;;
ズザーーーーーッ
| ?
|  ̄∨ ̄ (´´
| ∋oノハヽo∈ ) (´⌒(´
人 ⊂(´D`⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
( ) | ̄ ̄ ̄ ̄ ̄ ̄ (´⌒(´⌒;; ̄ ̄
 ̄ | ズザーーーーーッ
|
|
| (´´
|! (´⌒(´
∋oノハヽo∈ (´⌒;;;≡≡≡
(´D`; )⌒つ | ̄ ̄ ̄ ̄ ̄ (´⌒(´⌒;; ̄ ̄
⊂  ̄U |
|
|
| プラ〜ン
|
∋oノ|ヽo∈
( / ⌒ヽ | ̄ ̄ ̄ ̄ ̄ ̄ ̄
U ) |
UU |
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。