C言語なら俺に聞け(入門篇) Part 45at TECH
C言語なら俺に聞け(入門篇) Part 45 - 暇つぶし2ch1:デフォルトの名無しさん
09/02/19 20:47:45 BE:302948148-PLT(56870)
C言語の入門者向け解説スレッドです。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
 C/C++の宿題片付けます 122代目
 スレリンク(tech板)

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 44
スレリンク(tech板)
過去スレ
URLリンク(makimo.to:8000)

2:デフォルトの名無しさん
09/02/19 23:26:50
char *color_name[] = { "red", "green", "blue" };
printf("testcolorchar=%s\n", color_name[1]);
これで"green"が取得できるけど、
"green"の"n"を取得するには何て書けばいいんですかの。

3:デフォルトの名無しさん
09/02/19 23:30:44
・printf("%c\n", color_name[1][4]);
・printf("%c\n", strchr(color_name[1], 'n'));
・printf("%c\n", 1[color_name][4]);

4:デフォルトの名無しさん
09/02/19 23:31:27
いけね、2番目訂正。
printf("%c\n", * strchr(color_name[1], 'n'));

5:デフォルトの名無しさん
09/02/19 23:38:27
ノ printf("testcolorchar=%s\n", color_name[2]-2 );

6:デフォルトの名無しさん
09/02/19 23:40:46
>>5
それは無理。

7:デフォルトの名無しさん
09/02/19 23:58:42
>>3
printf("%c\n", color_name[1][4]);
エラーになって2時間悩んだけど%sにしてたからだったのか。

8:476
09/02/20 00:07:55
ポインタ演算子って多くないですか?
覚えるのややこしいし
int u[10][5];でu[1][2];の値を出すにはどうしますか?
私はu[1][2]とやります
わざわざ*(u[1]+2)とかやるのでめんどくさいので
統一とかあるんですか?

9:デフォルトの名無しさん
09/02/20 00:08:20
うぜえ

10:デフォルトの名無しさん
09/02/20 00:13:12
ポインタ操作ほど操作が統一されている物もないだろう…

11:デフォルトの名無しさん
09/02/20 00:27:00
かけ算と紛らわしいくらいでややこしいってほどのもんじゃなかったような

12:デフォルトの名無しさん
09/02/20 00:45:07
まだいたのか

13:デフォルトの名無しさん
09/02/20 00:54:26
まだ釣られてるのか

14:5
09/02/20 01:05:48
>>6 実行環境言ってみ
>>2は"n"の取得を聞いてる。
*color_name[] = { "red", "green", "blue" };
文字リテラルの初期化だから、目盛り構造は、
[r] [e] [d] [\0] [g] [r] [e] [e] [n] [\0] [b] [l] [u] [e] [\0]
printf("%s",p);の時か
p=color_name[1]+4; p =color_name[2]-2;
でpは、"n"へのポインタとなる。これが、"n"の取得と解釈した。

15:デフォルトの名無しさん
09/02/20 01:23:41
char*配列のデータが連続して配置される保障ってあるの?
別場所に同じ文字列があったりしたらコンパイラが配置の最適化できると思ったんだけど

16:デフォルトの名無しさん
09/02/20 01:28:02
>>14
配列の配列と勘違いしてるし
仮に配列の配列だとしても要素配列の間にパディングが入らない保障はない(滅多にないだろうけど)

17:デフォルトの名無しさん
09/02/20 01:41:48
>>14
パディングとか関係なく、連続で取られる保証はないし、
順番がソースコードの出現順である保証も全然ないし、
ありえないにも程がある

18:デフォルトの名無しさん
09/02/20 02:03:58
なんで必要性もなく、効率が良いわけでもないメモリ配置に依存しているコードを書くのよ…

19:デフォルトの名無しさん
09/02/20 02:04:16
>>14
実際にやってみなよ。"red,", "red", "blue", "green", "blue"みたいに重複が発生するように。
それでもあんたが主張するようにしか配置されていないのだとしたら、あんたの使っているコンパイラが蛸だ。

20:デフォルトの名無しさん
09/02/20 02:05:54
>>18
>14のことなら、今背伸びしたいお年頃なんでしょ。

21:デフォルトの名無しさん
09/02/20 02:13:02
>char *color_name[] = { "red", "green", "blue" };
>printf("testcolorchar=%s\n", color_name[1]);
>これで"green"が取得できるけど、
ここまでは分かる。しかし…

>"green"の"n"を取得するには何て書けばいいんですかの。
これが分からんのだよ。つまり最後の一文字を取得したいという事?
そうであれば以下のようにすればよいかと。

char *color_name[] = { "red", "green", "blue" };
char *element = color_name[1];
int len = strlen(element);
char c = element[len-1];

これで



22:デフォルトの名無しさん
09/02/20 02:17:57
…途中で送信してしまったorz

char *color_name[] = { "red", "green", "blue" };
char *element = color_name[1];
int len = strlen(element);
char c = element[len-1];

これで配列color_nameの第一要素"green" の最後の一文字がcに入るよ。
文字列や文字のsignedとunsignedの違いに気を付けてね。

23:デフォルトの名無しさん
09/02/20 02:26:17
ふつうに
char* pc;
pc = color_name[1];
for(i = 0; *(pc + 1) != '\0'; pc++);

では駄目なん?

24:デフォルトの名無しさん
09/02/20 02:28:32
ふつうとは?

25:デフォルトの名無しさん
09/02/20 02:28:40
       //
     /  /   パカッ
     //⌒)∩__∩
    /.| .| ノ     ヽ
    / | |  ●   ● |     
   /  | 彡  ( _●_) ミ  まピョーん☆
   /  | ヽ  |∪|  /_
  // │   ヽノ  \/
  " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ


26:デフォルトの名無しさん
09/02/20 02:28:52
iいらないじゃん…
寝ぼけているな俺

27:デフォルトの名無しさん
09/02/20 02:31:20
叩けるコードが出てきた時のこのスレの賑わいは異常

28:デフォルトの名無しさん
09/02/20 03:21:36
レベルが初歩的だとなおのこと盛況

29:デフォルトの名無しさん
09/02/20 03:24:18
叩けないコードを勘違いして叩いたあげくに逆ギレするよりよっぽどマシw

30:デフォルトの名無しさん
09/02/20 04:33:10
ここも2ちゃんだから、勘違い上級者なら叩かれても仕方ない。
しかしそのままずっと勘違いするよりはマシかもな

31:℃素人
09/02/20 09:02:10
/* プログラム① */
#include <stdio.h>

int main( void )
{
int *x,*y;
printf("%d\n",(&y-&x)); /* ここでの表示結果は"1" */
return 0;
}
//------------------------------------------------------
/* プログラム② */
#include <stdio.h>

int main( void )
{
int *x,*y;
printf("%d\n",sizeof(&y-&x)); /* ここでの表示結果は"4" */
return 0;
}
//-------------------------------------------------------
プログラム②ではsizeof演算子を付けて
望んでいた結果の"4"が出力されます。
何故、プログラム①では"1"が出力されるのでしょうか?

コンパイラは「Microsoft(R)32-bit C/C++ Standard Compiler」です。

32:デフォルトの名無しさん
09/02/20 09:07:33
1はアドレス同士の計算結果を表示してるのに対して、
2はアドレス同士の計算で返った結果のサイズ(アドレスのサイズ)を表示してるから。

33:℃素人
09/02/20 09:29:37
早速のレスありがとうございます。
しかし、①のプログラムでも"ポインタ"のアドレスの計算を
しているワケですので、私の32bit環境ではポインタとして
4byteをメモリに占めているので"4"が返ってきても良いとは
思うのですが・・・すみません。

34:デフォルトの名無しさん
09/02/20 09:31:17
>>31
その結果が正しいとして...
MSC++では、アドレスは4バイト単位みたいな感じ
ポインタは32ビットで表記するのにね。

35:デフォルトの名無しさん
09/02/20 09:35:59
>>33
ポインタ同士の引き算は、実際のアドレス値ではなくポイント対象の距離になる。
例えばこれらはどれも1。

int foo[2]; printf("%d\n", & foo[1] - & foo[0]);
char foo[2]; printf("%d\n", & foo[1] - & foo[0]);
double foo[2]; printf("%d\n", & foo[1] - & foo[0]);

しかし、配列やヒープのように連続していることが保証されている場合以外に
ポインタ同士の引き算を行なっても結果は保証されない。
つまり、>32の(1)は何が起きても不思議ではない危険なコードと言うことになる。

しかし、>32の(2)は演算結果の型のサイズを取得しているだけなので話は別。
>32の2行目の表現は、「アドレスのサイズ」ではなく「ポインタのサイズ」とするべき。

36:℃素人
09/02/20 09:50:00
>>35さん
ありがとうございます。
ちょっとこれから出かけてきますので、
また後ほど。

37:デフォルトの名無しさん
09/02/20 09:51:34
((char*)&foo[1]-(char *)&foo[0])/sizeof(type)
といつでも解釈して貰えると思ったらそれは違うだろ

38:やれやれだぜ
09/02/20 09:56:26
>>37
& foo[1] - & foo[0]
を等価の式に変換してごらん。

pointer[integer]は*(pointer + integer)と相互に置き換えが可能だから、
& pointer[integer]は&*(pointer + integer)になる。後は判るだろ。

39:デフォルトの名無しさん
09/02/20 10:45:50
久しぶりにプログラムを書いてみようとしたら、構造体やらポインタでつまずいた。

typedef struct Tag{
int member;
char text[1024];
}KOUZOUTAI;
メンバ変数のサイズの取得の仕方がわからん。

KOUZOUTAI Obj,*pObj;
pObj = &Obj
int size = sizeof(pObj->text);
でいいの? (size == 1024 になって欲しい)

あと、メンバ変数のアドレスを調べたい
memberのアドレスを調べるには、多分、&(pObj->member)でいいと思うけど、textの方は?
&(pObj->text[0])とかでいいの? それとも、pObj->text のようにするの?

普段、クラスはおろか構造体すら使わないので忘れてしまった。
どうでもいいけど、構造体ってコンストラクタを持てるんだね。初めて知った。

40:デフォルトの名無しさん
09/02/20 10:48:05
>普段、クラスはおろか構造体すら使わないので忘れてしまった。
>どうでもいいけど、構造体ってコンストラクタを持てるんだね。初めて知った。

そりゃあんた、言語が違いまんがな。

41:476
09/02/20 11:44:39
ポインタの説明が回りくどいんですが

int 型の変数へのポインタ値をしまうことのできるポインタ型変数 p が宣言される

これはつまり、int ball;があったとしたら

int型の変数(ball)のメモリアドレスの値(aのアドレス)をしまうことができる ポインタ*pってことでいいんですか?

日本語力とか言いますが一般人にはわかりずらいと思います

int a;  a は intである では無く  a は int型である のほうがわかりやすいと思いますし
int *a[10]; a は、intへのポインタの配列(要素数10)である。 これだと aはint型の配列を代入できるポインタとかでいいんですか?

ごっちゃになってるので誰か詳しくまとめてくれるとありがたいです。

42:デフォルトの名無しさん
09/02/20 11:48:32
試せばすぐ判るようなこと聞くなよ。
しかし仕事で構造体を使わないCプログラムを書いたこと無いんだが、
>>39はどういう分野の人なのかな。

あと476はもう結構

43:デフォルトの名無しさん
09/02/20 11:50:12
>日本語力とか言いますが一般人にはわかりずらいと思います
対象は一般人じゃなくてプログラマだからそれで良いんだよ。

>これだと aはint型の配列を代入できるポインタとかでいいんですか?
よくない

44:デフォルトの名無しさん
09/02/20 11:55:43
char score2grade(int s)
{
if(s >= 80){
return 'A';
}else if(s >= 65){
return 'B';
}else if(s >= 50){
return 'C';
}else if(s >= 35){
return 'D';
}else{
return 'F';
}
}
最後の行がparse error at end of inputらしいんですが
どう直せばいいのでしょうか?

45:476
09/02/20 11:58:46
44さん
私の環境ではコンパイラできました
たぶん他のコードでエラーがおこってるのかもしれません



46:44
09/02/20 12:01:21
自己解決できました

47:デフォルトの名無しさん
09/02/20 12:16:23
parse error at end of input
ホンニャクすると
こんだけのソースで仕事できっかよ!ゴラ


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch