トップページ⇒tech
1001コメント280KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2011/02/06(日) 18:33:49
C言語の*入門者*向け解説スレッドです。
★前スレ
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:16
突っ込みは◆QZaw55cn4cの独断場
0238デフォルトの名無しさん2011/02/09(水) 00:17:20
>>236
だって、大基地に群がるキチガイだからな
0239デフォルトの名無しさん2011/02/09(水) 00:18:01
>>236==>>238==◆QZaw55cn4c
0240デフォルトの名無しさん2011/02/09(水) 00:18:38
◆QZaw55cn4c糞すぎワロタ
0241デフォルトの名無しさん2011/02/09(水) 00:19:27
>>239==大基地に群がるキチガイ
0242デフォルトの名無しさん2011/02/09(水) 00:19:46
>>241==◆QZaw55cn4c
0243デフォルトの名無しさん2011/02/09(水) 00:20:30
わかりやすすぎる
◆QZaw55cn4cは頭に血が上ると見境が付かなくなる馬鹿ですね
0244デフォルトの名無しさん2011/02/09(水) 00:21:59
◆QZaw55cn4cは自分のスレで引きこもって金儲けでもしてろよ
0245デフォルトの名無しさん2011/02/09(水) 00:25:15
こいつ近い将来犯罪を犯しそうなタイプだよな
おーこわ
0246デフォルトの名無しさん2011/02/09(水) 00:31:53
基地外がいっぱい
0247デフォルトの名無しさん2011/02/09(水) 00:32:50
衒学的ってことだな
0248デフォルトの名無しさん2011/02/09(水) 00:34:02
正規分布にのっとった乱数がほしい
0249デフォルトの名無しさん2011/02/09(水) 00:48:35
◆QZaw55cn4cは糞
0250デフォルトの名無しさん2011/02/09(水) 01:01:41
void mem_cpy(void *dst,void *src,u_int size){
     char *p1 = *dst;
     char *p2 = *src;
     while(size--){
          *p1** = *p2++;
     }
}
基本的なソースはこういう形として,
こういう形で,エンディアンの問題を回避する方法ってある?
0251デフォルトの名無しさん2011/02/09(水) 01:03:45
>>250
C言語でないものはスレ違い
0252デフォルトの名無しさん2011/02/09(水) 01:05:16
>>250
エンディアンの問題って、何を「問題」だと思ってるの?

それによって解答は変わる。
0253デフォルトの名無しさん2011/02/09(水) 01:07:34
sscanf( str,"<hogehoge='111'><hogehoge=\"unkunk\">%I64</hogehoge><return type=\"string\">%s</return></result>",&did, buf);

bufに何も入らないんだけど何が悪いんだ?
0254デフォルトの名無しさん2011/02/09(水) 01:08:27
bufの型
02552532011/02/09(水) 01:09:56
char buf[256];
0256デフォルトの名無しさん2011/02/09(水) 01:11:42
>>253
sscanf のリターンコードを見るんだ
0257デフォルトの名無しさん2011/02/09(水) 01:12:16
strの内容も見たいよ
0258デフォルトの名無しさん2011/02/09(水) 01:13:48
>>253
その%sだと空白文字(' ', '\n', '\t')を含む文字列は取り込めないが大丈夫か?
逆に、</return>の前に空白がないとくっついてしまうが大丈夫か?
"%s"の代わりに"%255[^<]"にでもした方がいいかも試練。
0259デフォルトの名無しさん2011/02/09(水) 01:14:00
http://hibari.2ch.net/test/read.cgi/tech/1295273862/
0260デフォルトの名無しさん2011/02/09(水) 01:19:50
>>259
糞ワロタw
0261デフォルトの名無しさん2011/02/09(水) 01:20:20
>>258
良レス
0262 ◆QZaw55cn4c 2011/02/09(水) 01:20:31
>>253
%I64d
02632502011/02/09(水) 01:23:05
組み込みをするときに
エンディアンの違うコンピュータで動作させることになって,
エンディアンの違いによってコピー結果が変わる事象です
0264デフォルトの名無しさん2011/02/09(水) 01:23:52
<hogehoge='111'><hogehoge=\"unkunk\">4503599628031276</hogehoge><return type="string">@Unk_dayo</return></result>
↑こんな感じのがポインタでくるから
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
>>262
>>258
ありがとうございます

0266デフォルトの名無しさん2011/02/09(水) 01:33:40
面倒臭がらないで自分でstrtokで解析しろよ
0267デフォルトの名無しさん2011/02/09(水) 01:38:22
やだ
0268デフォルトの名無しさん2011/02/09(水) 01:40:24
じゃあ正規表現ライブラリでもリンクしろ
0269デフォルトの名無しさん2011/02/09(水) 01:50:58
C#ならregex付いてるのになあ
C使いは大変だな
0270デフォルトの名無しさん2011/02/09(水) 01:54:39
明後日の方向で優越感に浸ってる人が居るw
Cを知らないと大変だな
0271デフォルトの名無しさん2011/02/09(水) 02:01:22
>>263
エスパーすると
#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
>>263
>>250においては問題ない。その問題は外で解決すべき
0273デフォルトの名無しさん2011/02/09(水) 02:33:35
C言語プログラミングの初歩の初歩という本を読んでるんですが
P.74でscanfは変数に値を読み込むときは変数名の先頭に&をつけると書いてあるんですが
P.191をみるとscanf("%s",input);なんてかいてあるんですが
&を書く場合と書かない場合について教えてください。
02742732011/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:47
>>274
c
&c
&c[0]
&0[c]
どれも等価だから。
0276デフォルトの名無しさん2011/02/09(水) 03:04:57
>>275
&c は型が違う
0277デフォルトの名無しさん2011/02/09(水) 03:08:13
char c[81]; としたとき、cは&c[0]と同じ意味。
&cはちょっと特殊で、生み出されたポインタの型がちがうんだけど、
それを活用する場面はあまりないし、上記のいずれかを使えばいいよ。

&をつけるかどうかについては、引数にポインタを渡さなければならないという観点でみると
整理できるかも。
0278デフォルトの名無しさん2011/02/09(水) 03:09:26
あら、レスついてた。スレ汚しスマソ。
0279デフォルトの名無しさん2011/02/09(水) 03:09:48
あぁ、確かにそうだな
スマン
0280デフォルトの名無しさん2011/02/09(水) 03:13:32
一生懸命全部WCHARにして
while (fgetws(data, 1000, fp) != NULL){したらここで1回はブレークポイントで止まるのですがその後落ちます。次の行では止まりません。(WCHAR data
次の行swscanf_s(data,L"%s ; %s ; %s ; %d ; %d ; %d",&変数〜
どうしてでしょうか?
0281デフォルトの名無しさん2011/02/09(水) 03:17:31
開いてるファイルはunicodeで記述されてるの?
0282デフォルトの名無しさん2011/02/09(水) 03:22:28
&cをインクリメントすると81バイト進むんですか?
02832732011/02/09(水) 03:24:48
ポインタとか型とかを知らないと理解できないってことか…
0284デフォルトの名無しさん2011/02/09(水) 03:25:09
>>280
うせろクズ
0285デフォルトの名無しさん2011/02/09(水) 03:26:53
>>280
荒らしないでくだちい
0286デフォルトの名無しさん2011/02/09(水) 03:29:30
>>283
関数に変数の値を変えてもらうには変数のアドレスを渡さないといけないんだよ。
ただ配列の場合はchar a[16]とするとaと書くだけで配列の先頭のアドレスを意味するからscanfでもaだけで良い。
0287デフォルトの名無しさん2011/02/09(水) 03:32:20
>>283
しばらくポインタ型の変数を宣言する予定がないなら、
配列は配列名を渡す(&をつけない)
配列ではない場合は&をつける
でいいよ。
0288デフォルトの名無しさん2011/02/09(水) 03:33:58
>>282
そうです。
配列のアドレスだからです
0289デフォルトの名無しさん2011/02/09(水) 03:35:30
>>281
ありがとうございます
.txtのファイルを読み込んでいるので、読み込むテキストをメモ帳でunicodeで保存しなおしましたが
やはり同じ所で落ちます。
0290デフォルトの名無しさん2011/02/09(水) 03:43:32
>>289
dataの宣言は?
というか再現できるコードもらったほうが早いかも。
0291デフォルトの名無しさん2011/02/09(水) 03:49:17
>>282
インクリメントされるのでテストコードを書いてみる勉強をどうぞ
0292デフォルトの名無しさん2011/02/09(水) 03:51:46
落ちた理由を調べるのが手っ取り早いと思うけどね。
なに、coreファイルが作成されていない?
0293デフォルトの名無しさん2011/02/09(水) 03:52:03
>>290
すみません。
ファイルの読み込み時に
if ( (fp = fopen(readfile, "r") )== NULL){終了i}から
if ( _wfopen_s(&fp,readfile, L"r")== NULL){終了}に変えた時に!=としなかったので正常終了ならNULLが帰るため正常終了していないのに終了していませんでした
ありがとうございました
0294デフォルトの名無しさん2011/02/09(水) 03:55:19
>>293
解決してよかった。続きをがんばれ。
0295デフォルトの名無しさん2011/02/09(水) 03:57:40
_wfopen_sの直後に終了してるならfgetwsの行にこないと思うが、まぁいいか。
02962732011/02/09(水) 04:05:08
>>286-287
理解できそうでできない…
関数は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:28
> 関数はint main(){}のことで
mainも関数だし、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
>>296
>その理論で行くとscanf("%s",a[0])でscanf("%s",a)と同じってことだよね

違うよ。
aと等価なのは&a[0]。
02992732011/02/09(水) 04:40:34
>>297-298
なるほど、そういうのを全部関数っていうのか

要素とアドレスを間違えていたせいで変なことを言ってしまいました
この本340ページもあるのにアドレスなんて言葉ひとことも書いてない…
>>277の文が理解できるまでネットで調べて頑張ってみます。
0300デフォルトの名無しさん2011/02/09(水) 04:46:27
>>296
可能ならば、一番最初にポインタ(メモリアドレスの概念)を学んだ方がいい
実用的なCプログラムは、ほぼ全てがアドレスありきだから
頭の中でメモリをイメージ出来さえすればポインタなんて難しくもなんともなくなるよ
0301デフォルトの名無しさん2011/02/09(水) 06:44:34
do while のwhileにはwhile();
;がつくのに

普通のwhile(){}には
while();とならない。

何故ですか?
0302デフォルトの名無しさん2011/02/09(水) 08:50:19
>>301
while (条件) ; // 実行文がない。
この場合はセミコロンが必要です。同じことは
do {} while (条件) ;
とも書けます。やっぱりセミコロンが必要ですね。問題ありません。
0303デフォルトの名無しさん2011/02/09(水) 08:59:36
>>302
ありがぷー
0304デフォルトの名無しさん2011/02/09(水) 09:04:54
do ; while (1);
0305デフォルトの名無しさん2011/02/09(水) 11:30:36
>>262
あ、お前は氏んでください
0306デフォルトの名無しさん2011/02/09(水) 16:57:42
ぷっぷー
0307デフォルトの名無しさん2011/02/09(水) 17:11:52
ぷっぷー
0308デフォルトの名無しさん2011/02/09(水) 18:01:05
直ったのか
0309デフォルトの名無しさん2011/02/09(水) 18:05:53
直ったのか
0310デフォルトの名無しさん2011/02/09(水) 18:13:48
直ってない
0311デフォルトの名無しさん2011/02/09(水) 19:40:11
直ってない
0312デフォルトの名無しさん2011/02/09(水) 19:51:16
直ってない
03132732011/02/09(水) 20:20:45
結局メモリとアドレスについてよくわからないんだけど
int a;
a=5;
とやるとメモリとかアドレスとかはどういう動きをするの?
ポインタはアドレスを記憶するための変数って認識で合ってると思うけど。
0314デフォルトの名無しさん2011/02/09(水) 20:21:26
メモリもアドレスも別に動きはしない
0315デフォルトの名無しさん2011/02/09(水) 20:38:35
変数のサイズ分の領域を確保するだけ
0316デフォルトの名無しさん2011/02/09(水) 20:49:01
>>313
こういう単純な問いが実は一番答えにくかったりする
ポインタについて聞かれた日にゃどう説明していいやら
0317デフォルトの名無しさん2011/02/09(水) 20:55:03
>>313
計算機の基礎からやり直せ
0318デフォルトの名無しさん2011/02/09(水) 20:57:45
メモリは運動しないが
信号に応答するという意味で「動く」ぞ
03192732011/02/09(水) 21:06:16
int a;でまず0x65fdf4というアドレスが確保されて
メモリの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 を記憶するだけ
03212732011/02/09(水) 21:31:15
0x65fdf4のメモリ領域っていうのは変数 a 1文字だけじゃなく
変数aが5だという情報を記憶できるってことか
0322デフォルトの名無しさん2011/02/09(水) 21:37:04
「a」とかいう変数の名前は、コンパイル後のプログラム(exeファイル)からは消え去っているので、それを覚える領域は要らない
値を記憶する領域だけが必要で、それが変数のアドレス
0323デフォルトの名無しさん2011/02/09(水) 21:40:27
>>321
0x65fdf4は俺の家の住所
変数 aは俺の家名前
変数aが5は俺の家にいる奴
0324デフォルトの名無しさん2011/02/09(水) 21:42:25
家に名前をつけるのって喩えになってるの?そんな奴、存在するの?
0325デフォルトの名無しさん2011/02/09(水) 21:51:51
この辺はどうやって説明したら良いか難しいよね
0326デフォルトの名無しさん2011/02/09(水) 21:57:22
コンピューターはメモリーを持っている。
メモリーはアドレスと値を対応付けて記憶できるようになっていて、アドレスを指定して対応する値を読み出すことが出来るようになっている。
アドレスは例えば0x0065fdf4(16進数)のような32ビットの数字で表されるが、人間には分かりにくいのでaとかという別名をつける。
ただ、aと書いてしまうと今度はコンピュータが理解できなくなるので、
人間がaに5を記憶させるつもりで、a = 5; と書いたもの(ソースコード)を、0x0065fdf4に5を記憶しろとコンピュータへの命令(機械語)に変換するのがコンパイラ。
0327デフォルトの名無しさん2011/02/09(水) 21:59:16
>>321
自分でお絵かきすればすぐに理解できるからやってごらん。

メモリは1列に並んだ箱の集まり。
それぞれの箱に番号を振ると箱1や箱2となるが、その番号部分がアドレス。
そして箱の中には「数値」だけしか入れられない。

その箱の中の「数値」を機械に「どう解釈させるか?」を決めるのが型。
int aなら、箱の中身は符号付整数と機械は解釈する。
int *aなら、箱の中身は他の箱番号を指している、つまりint型へのポインタと機械は解釈する。
0328デフォルトの名無しさん2011/02/09(水) 22:01:43
int a、int *aと箱の関係が分からない。
0329デフォルトの名無しさん2011/02/09(水) 22:07:15
いい加減みんな釣られすぎw
0330デフォルトの名無しさん2011/02/09(水) 22:12:03
ゲソ!
0331デフォルトの名無しさん2011/02/09(水) 22:16:47
何でも釣りとか言われたら機能しないぞw
0332デフォルトの名無しさん2011/02/09(水) 22:17:40
C言語の本スレでやってください
http://hibari.2ch.net/test/read.cgi/tech/1295273862/
0333デフォルトの名無しさん2011/02/09(水) 22:20:04
>>328
つまり、int aもint *aも、実際はどこかの箱(アドレス)を指しているにすぎない。
箱自体なのか中身なのか、その違いを識別させるのが型ってこと。
03342732011/02/09(水) 22:24:46
>>326-327
なるほど、理解できたと思う
>>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:32
Exactly!
0336デフォルトの名無しさん2011/02/09(水) 22:31:19
箱wwwwwwwwwwwwwwwwwww
■ このスレッドは過去ログ倉庫に格納されています