C言語なら俺に聞け(入門編)Part 78
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2011/02/06(日) 18:33:49★前スレ
C言語なら俺に聞け(入門編)Part 77
http://hibari.2ch.net/test/read.cgi/tech/1295721606/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 146代目
http://hibari.2ch.net/test/read.cgi/tech/1296387672/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0237デフォルトの名無しさん
2011/02/09(水) 00:15:160238デフォルトの名無しさん
2011/02/09(水) 00:17:20だって、大基地に群がるキチガイだからな
0239デフォルトの名無しさん
2011/02/09(水) 00:18:010240デフォルトの名無しさん
2011/02/09(水) 00:18:380241デフォルトの名無しさん
2011/02/09(水) 00:19:270242デフォルトの名無しさん
2011/02/09(水) 00:19:460243デフォルトの名無しさん
2011/02/09(水) 00:20:30◆QZaw55cn4cは頭に血が上ると見境が付かなくなる馬鹿ですね
0244デフォルトの名無しさん
2011/02/09(水) 00:21:590245デフォルトの名無しさん
2011/02/09(水) 00:25:15おーこわ
0246デフォルトの名無しさん
2011/02/09(水) 00:31:530247デフォルトの名無しさん
2011/02/09(水) 00:32:500248デフォルトの名無しさん
2011/02/09(水) 00:34:020249デフォルトの名無しさん
2011/02/09(水) 00:48:350250デフォルトの名無しさん
2011/02/09(水) 01:01:41char *p1 = *dst;
char *p2 = *src;
while(size--){
*p1** = *p2++;
}
}
基本的なソースはこういう形として,
こういう形で,エンディアンの問題を回避する方法ってある?
0251デフォルトの名無しさん
2011/02/09(水) 01:03:45C言語でないものはスレ違い
0252デフォルトの名無しさん
2011/02/09(水) 01:05:16エンディアンの問題って、何を「問題」だと思ってるの?
それによって解答は変わる。
0253デフォルトの名無しさん
2011/02/09(水) 01:07:34bufに何も入らないんだけど何が悪いんだ?
0254デフォルトの名無しさん
2011/02/09(水) 01:08:270255253
2011/02/09(水) 01:09:560256デフォルトの名無しさん
2011/02/09(水) 01:11:42sscanf のリターンコードを見るんだ
0257デフォルトの名無しさん
2011/02/09(水) 01:12:160258デフォルトの名無しさん
2011/02/09(水) 01:13:48その%sだと空白文字(' ', '\n', '\t')を含む文字列は取り込めないが大丈夫か?
逆に、</return>の前に空白がないとくっついてしまうが大丈夫か?
"%s"の代わりに"%255[^<]"にでもした方がいいかも試練。
0259デフォルトの名無しさん
2011/02/09(水) 01:14:000260デフォルトの名無しさん
2011/02/09(水) 01:19:50糞ワロタw
0261デフォルトの名無しさん
2011/02/09(水) 01:20:20良レス
%I64d
0263250
2011/02/09(水) 01:23:05エンディアンの違うコンピュータで動作させることになって,
エンディアンの違いによってコピー結果が変わる事象です
0264デフォルトの名無しさん
2011/02/09(水) 01:23:52↑こんな感じのがポインタでくるから
sscanf( str,"<hogehoge='111'><hogehoge=\"unkunk\">%I64</hogehoge><return type=\"string\">%s</return></result>",&did, buf);
で@Unk_dayoをとりたいんです
0265デフォルトの名無しさん
2011/02/09(水) 01:29:03>>258
ありがとうございます
0266デフォルトの名無しさん
2011/02/09(水) 01:33:400267デフォルトの名無しさん
2011/02/09(水) 01:38:220268デフォルトの名無しさん
2011/02/09(水) 01:40:240269デフォルトの名無しさん
2011/02/09(水) 01:50:58C使いは大変だな
0270デフォルトの名無しさん
2011/02/09(水) 01:54:39Cを知らないと大変だな
0271デフォルトの名無しさん
2011/02/09(水) 02:01:22エスパーすると
#ifdef BO_UNIX
# define READ2LE ...
# define READ4LE ...
# define READ8LE ...
# define READ2BE ...
...
#elif defined BO_XINU
# define READ4LE ...
...
#endif
などのマクロを介せばいい
0272デフォルトの名無しさん
2011/02/09(水) 02:05:08>>250においては問題ない。その問題は外で解決すべき
0273デフォルトの名無しさん
2011/02/09(水) 02:33:35P.74でscanfは変数に値を読み込むときは変数名の先頭に&をつけると書いてあるんですが
P.191をみるとscanf("%s",input);なんてかいてあるんですが
&を書く場合と書かない場合について教えてください。
0274273
2011/02/09(水) 02:40:20//入力された英数字文字列に対して、小文字があればそれを大文字に置き換えるプログラム
//ただし、英数字は1行最大80文字まで入力でき、日本語や空白等は入力しないものとする。
#include<stdio.h>
int main()
{
char c[81];
int loop;
for(loop=0;loop<81;loop++) //c[81]を\0で初期化
{
c[loop] = '\0';
}
printf("文字列を入力してください(英数字で)\n");
scanf("%s",c); //ここでscanf("%s",&c);と書いても同じになるよ
for(loop=0;loop<81;loop++)
{
if(c[loop]>=97 && c[loop]<=122)
{
c[loop] -= 32 ;
}
}
printf("小文字を大文字に変換しました\n%s\n",c);
}
0275デフォルトの名無しさん
2011/02/09(水) 03:02:47c
&c
&c[0]
&0[c]
どれも等価だから。
0276デフォルトの名無しさん
2011/02/09(水) 03:04:57&c は型が違う
0277デフォルトの名無しさん
2011/02/09(水) 03:08:13&cはちょっと特殊で、生み出されたポインタの型がちがうんだけど、
それを活用する場面はあまりないし、上記のいずれかを使えばいいよ。
&をつけるかどうかについては、引数にポインタを渡さなければならないという観点でみると
整理できるかも。
0278デフォルトの名無しさん
2011/02/09(水) 03:09:260279デフォルトの名無しさん
2011/02/09(水) 03:09:48スマン
0280デフォルトの名無しさん
2011/02/09(水) 03:13:32while (fgetws(data, 1000, fp) != NULL){したらここで1回はブレークポイントで止まるのですがその後落ちます。次の行では止まりません。(WCHAR data
次の行swscanf_s(data,L"%s ; %s ; %s ; %d ; %d ; %d",&変数〜
どうしてでしょうか?
0281デフォルトの名無しさん
2011/02/09(水) 03:17:310282デフォルトの名無しさん
2011/02/09(水) 03:22:280283273
2011/02/09(水) 03:24:480284デフォルトの名無しさん
2011/02/09(水) 03:25:09うせろクズ
0285デフォルトの名無しさん
2011/02/09(水) 03:26:53荒らしないでくだちい
0286デフォルトの名無しさん
2011/02/09(水) 03:29:30関数に変数の値を変えてもらうには変数のアドレスを渡さないといけないんだよ。
ただ配列の場合はchar a[16]とするとaと書くだけで配列の先頭のアドレスを意味するからscanfでもaだけで良い。
0287デフォルトの名無しさん
2011/02/09(水) 03:32:20しばらくポインタ型の変数を宣言する予定がないなら、
配列は配列名を渡す(&をつけない)
配列ではない場合は&をつける
でいいよ。
0288デフォルトの名無しさん
2011/02/09(水) 03:33:58そうです。
配列のアドレスだからです
0289デフォルトの名無しさん
2011/02/09(水) 03:35:30ありがとうございます
.txtのファイルを読み込んでいるので、読み込むテキストをメモ帳でunicodeで保存しなおしましたが
やはり同じ所で落ちます。
0290デフォルトの名無しさん
2011/02/09(水) 03:43:32dataの宣言は?
というか再現できるコードもらったほうが早いかも。
0291デフォルトの名無しさん
2011/02/09(水) 03:49:17インクリメントされるのでテストコードを書いてみる勉強をどうぞ
0292デフォルトの名無しさん
2011/02/09(水) 03:51:46なに、coreファイルが作成されていない?
0293デフォルトの名無しさん
2011/02/09(水) 03:52:03すみません。
ファイルの読み込み時に
if ( (fp = fopen(readfile, "r") )== NULL){終了i}から
if ( _wfopen_s(&fp,readfile, L"r")== NULL){終了}に変えた時に!=としなかったので正常終了ならNULLが帰るため正常終了していないのに終了していませんでした
ありがとうございました
0294デフォルトの名無しさん
2011/02/09(水) 03:55:19解決してよかった。続きをがんばれ。
0295デフォルトの名無しさん
2011/02/09(水) 03:57:400296273
2011/02/09(水) 04:05:08理解できそうでできない…
関数はint main(){}のことで
変数ってのはc[81]で
配列の先頭のアドレスってchar a[16]の場合はa[0]のことでしょ
その理論で行くとscanf("%s",a[0])でscanf("%s",a)と同じってことだよね
でもa[0]に文字列って入らないと思う…入るのって1文字だけ?
プログラミングは始めたばっかだけどポインタ型の変数ってやつは近いうちにやってみたいな
0297デフォルトの名無しさん
2011/02/09(水) 04:11:28mainも関数だし、scanfも関数。もちろんprintfも。
>>286が言った「関数」はここではscanfを指している。
> 配列の先頭のアドレスってchar a[16]の場合はa[0]のことでしょ
a[0]は配列の先頭要素であって、先頭のアドレスじゃないので
> その理論で行くとscanf("%s",a[0])でscanf("%s",a)と同じってことだよね
上記の間違いにより、これも間違い。
>>277で書いたとおり、scanf("%s",&a[0])とscanf("%s",a)は同じ。
> でもa[0]に文字列って入らないと思う…入るのって1文字だけ?
そのとおり。
0298デフォルトの名無しさん
2011/02/09(水) 04:13:41>その理論で行くとscanf("%s",a[0])でscanf("%s",a)と同じってことだよね
違うよ。
aと等価なのは&a[0]。
0299273
2011/02/09(水) 04:40:34なるほど、そういうのを全部関数っていうのか
要素とアドレスを間違えていたせいで変なことを言ってしまいました
この本340ページもあるのにアドレスなんて言葉ひとことも書いてない…
>>277の文が理解できるまでネットで調べて頑張ってみます。
0300デフォルトの名無しさん
2011/02/09(水) 04:46:27可能ならば、一番最初にポインタ(メモリアドレスの概念)を学んだ方がいい
実用的なCプログラムは、ほぼ全てがアドレスありきだから
頭の中でメモリをイメージ出来さえすればポインタなんて難しくもなんともなくなるよ
0301デフォルトの名無しさん
2011/02/09(水) 06:44:34;がつくのに
普通のwhile(){}には
while();とならない。
何故ですか?
0302デフォルトの名無しさん
2011/02/09(水) 08:50:19while (条件) ; // 実行文がない。
この場合はセミコロンが必要です。同じことは
do {} while (条件) ;
とも書けます。やっぱりセミコロンが必要ですね。問題ありません。
0303デフォルトの名無しさん
2011/02/09(水) 08:59:36ありがぷー
0304デフォルトの名無しさん
2011/02/09(水) 09:04:540305デフォルトの名無しさん
2011/02/09(水) 11:30:36あ、お前は氏んでください
0306デフォルトの名無しさん
2011/02/09(水) 16:57:420307デフォルトの名無しさん
2011/02/09(水) 17:11:520308デフォルトの名無しさん
2011/02/09(水) 18:01:050309デフォルトの名無しさん
2011/02/09(水) 18:05:530310デフォルトの名無しさん
2011/02/09(水) 18:13:480311デフォルトの名無しさん
2011/02/09(水) 19:40:110312デフォルトの名無しさん
2011/02/09(水) 19:51:160313273
2011/02/09(水) 20:20:45int a;
a=5;
とやるとメモリとかアドレスとかはどういう動きをするの?
ポインタはアドレスを記憶するための変数って認識で合ってると思うけど。
0314デフォルトの名無しさん
2011/02/09(水) 20:21:260315デフォルトの名無しさん
2011/02/09(水) 20:38:350316デフォルトの名無しさん
2011/02/09(水) 20:49:01こういう単純な問いが実は一番答えにくかったりする
ポインタについて聞かれた日にゃどう説明していいやら
0317デフォルトの名無しさん
2011/02/09(水) 20:55:03計算機の基礎からやり直せ
0318デフォルトの名無しさん
2011/02/09(水) 20:57:45信号に応答するという意味で「動く」ぞ
0319273
2011/02/09(水) 21:06:16メモリの0x65fdf4というアドレスにaという変数が記憶される。
ここまでは合ってると思うんだけど
a=5;ではさらに0x~~1というアドレスが確保されて
メモリの0x~~1というアドレスに5という値が記憶されて
0x65fdf4と0x~~1が同じものをさしてますよという情報を
記憶するアドレス0x~~2があるってことですか
0320デフォルトの名無しさん
2011/02/09(水) 21:21:20変数 a のアドレスが 0x65fdf4 なら、
a=5 はアドレス 0x65fdf4 のメモリ領域に数値 5 を記憶するだけ
0321273
2011/02/09(水) 21:31:15変数aが5だという情報を記憶できるってことか
0322デフォルトの名無しさん
2011/02/09(水) 21:37:04値を記憶する領域だけが必要で、それが変数のアドレス
0323デフォルトの名無しさん
2011/02/09(水) 21:40:270x65fdf4は俺の家の住所
変数 aは俺の家名前
変数aが5は俺の家にいる奴
0324デフォルトの名無しさん
2011/02/09(水) 21:42:250325デフォルトの名無しさん
2011/02/09(水) 21:51:510326デフォルトの名無しさん
2011/02/09(水) 21:57:22メモリーはアドレスと値を対応付けて記憶できるようになっていて、アドレスを指定して対応する値を読み出すことが出来るようになっている。
アドレスは例えば0x0065fdf4(16進数)のような32ビットの数字で表されるが、人間には分かりにくいのでaとかという別名をつける。
ただ、aと書いてしまうと今度はコンピュータが理解できなくなるので、
人間がaに5を記憶させるつもりで、a = 5; と書いたもの(ソースコード)を、0x0065fdf4に5を記憶しろとコンピュータへの命令(機械語)に変換するのがコンパイラ。
0327デフォルトの名無しさん
2011/02/09(水) 21:59:16自分でお絵かきすればすぐに理解できるからやってごらん。
メモリは1列に並んだ箱の集まり。
それぞれの箱に番号を振ると箱1や箱2となるが、その番号部分がアドレス。
そして箱の中には「数値」だけしか入れられない。
その箱の中の「数値」を機械に「どう解釈させるか?」を決めるのが型。
int aなら、箱の中身は符号付整数と機械は解釈する。
int *aなら、箱の中身は他の箱番号を指している、つまりint型へのポインタと機械は解釈する。
0328デフォルトの名無しさん
2011/02/09(水) 22:01:430329デフォルトの名無しさん
2011/02/09(水) 22:07:150330デフォルトの名無しさん
2011/02/09(水) 22:12:030331デフォルトの名無しさん
2011/02/09(水) 22:16:470332デフォルトの名無しさん
2011/02/09(水) 22:17:40http://hibari.2ch.net/test/read.cgi/tech/1295273862/
0333デフォルトの名無しさん
2011/02/09(水) 22:20:04つまり、int aもint *aも、実際はどこかの箱(アドレス)を指しているにすぎない。
箱自体なのか中身なのか、その違いを識別させるのが型ってこと。
0334273
2011/02/09(水) 22:24:46なるほど、理解できたと思う
>>327の最後の行と>>326の内容から察するに、
int a; int *p; p=&a; について int型変数aのアドレスが0x0065fdf4、int型ポインタpのアドレスが0x0065fdf8だとすると、
人間がpに0x0065fdf4を記憶させるつもりでp=&aと書いたものを、
コンパイラは0x0065fdf8に0x0065fdf4を記憶しろとコンピュータへ命令するってことだ
つまりメモリは0x0065fdf8にpと0x0065fdf4が同じだという情報を記憶するのではなく
0x0065fdf8というアドレスには0x0065fdf4という値が入った状態になるってことだな
0335デフォルトの名無しさん
2011/02/09(水) 22:28:320336デフォルトの名無しさん
2011/02/09(水) 22:31:19■ このスレッドは過去ログ倉庫に格納されています