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

C言語なら俺に聞け(入門篇) Part 4

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/09(木) 00:31:01
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 3
http://pc8.2ch.net/test/read.cgi/tech/1160682950/

過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/


関連スレ
くだすれC言語(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1153542424/

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/
04824482006/11/19(日) 17:02:52
>>481
ありがとうございます、変な文字も出ず解決しました
0483デフォルトの名無しさん2006/11/20(月) 00:58:40
>>461らへん
sqrt()する数値をabs(b*b-4*a*c)
にして、
abs(b*b-4*a*c)!=b*b-4*a*c
だったらb*b-4*a*cは負の数になってるので、
答えの最後に「i」を表示すれば一応ソレらしきものにはなるのでは
0484デフォルトの名無しさん2006/11/20(月) 01:23:27
便乗質問ですみませんが
#include <stdio.h>
int main(void){
printf("%*s","hogehoge",10);/*10は適当な数値*/
return 0;
}
はどこか構文間違えていますか?
コンパイルは通るのですが、不正終了してしまいます
三行目printf("%*s","hoge","piyo",10);にすれば実行は出来ますが
数千個分の改行とスペースが出力されるだけです
環境はWinXP VC++Toolkit2003です
%10sのようなフィールド幅指定は問題ありませんでした
0485デフォルトの名無しさん2006/11/20(月) 02:16:49
printf("%*s", 10, "hogehoge");
04864842006/11/20(月) 02:25:02
orz
すみません、初歩的なミス過ぎますね・・・
夜更けにどうもありがとうございました
0487デフォルトの名無しさん2006/11/20(月) 05:21:50
for(;; p_turn = !p_turn){

とはどう言う意味でしょうか?

あと
for(;;)と言うのも参考書に載っていますが
意味がわかりませんので
これら二つの、ご助言を宜しくお願い致します。

こちらのスレで質問するのが正しいと思いました
マルチではありません。
0488デフォルトの名無しさん2006/11/20(月) 06:23:54
ttp://pc8.2ch.net/test/read.cgi/tech/1160897843/52

質問を撤回してない
マルチ氏ね
0489デフォルトの名無しさん2006/11/20(月) 06:46:08
http://pc8.2ch.net/test/read.cgi/tech/1160897843/52-
0490デフォルトの名無しさん2006/11/20(月) 15:31:07
3次元配列をポインタで動的メモリ割り当てするのってこれであってる?

#include<stdio.h>
#include<stdlib.h>
main()
{
int i,j;
int ***z;
z = (int ***)malloc( 3 * sizeof(int **));
z[0] = (int **)malloc( 4 * sizeof(int *));
z[0][0] = (int *)malloc( 3 * 4 * 5 * sizeof(int));

for(i=0;i<3;i++){
z[i] = z[0] + i * 4;
}
for(i=0;i<3;i++){
for(j=0;j<4;j++){
z[i][j] = z[0][0] + i * 5;
}
}

free(z);
return 0;
}
0491デフォルトの名無しさん2006/11/20(月) 15:33:48
>>490
free(z)だけでは足りない。

free(z[0][0]);
free(z[0]);
free(z);
0492デフォルトの名無しさん2006/11/20(月) 19:06:41
循環定義を含むプログラムを正しくコンパイルするにはどうすればいいですか?
以下のようなコードを書いたところ、コンパイル時に
error: dereferencing pointer to incomplete type
というエラーが出てしまいます。


typedef struct sa *sa_p; // 先に sa のポインタだけ定義

typedef struct {
  sa_p a2;
} sb, *sb_p;

typedef struct { // sa の本体を定義
  sb_p b;
} sa;

int main() {
  sa_p a = (sa_p)malloc(sizeof(sa));
  a->b->a2 = a; // compile error
  return 0;
}
0493デフォルトの名無しさん2006/11/20(月) 19:30:58
それ循環のせいじゃないし。
コンパイルが通らないのは当然かつそれでは実行時も落ちるだろう。
>typedef struct { // sa の本体を定義
>  sb_p b;
>} sa;
ここで無名構造体をtypedefしたsaと本来のstruct saが別物になってる。
でもって
>  a->b->a2 = a; // compile error
ここでおそらく落ちる。ちゃんと
a->b = (sb_p)malloc(sizeof(sb));
とやってからにしろ。
0494デフォルトの名無しさん2006/11/20(月) 21:45:35
携帯電話のiアプリは起動するとほとんどのがjavaで作ってるみたいなのですが
Cでも作ることはできるのでしょうか?
0495デフォルトの名無しさん2006/11/20(月) 21:49:35
>>494
クロスコンパイラ持ってれば出来るんじゃね?
0496デフォルトの名無しさん2006/11/20(月) 22:26:22
ちょいと質問させてくださいな。
やっぱりプロトタイプ宣言はすべきなのですか?

これは、一番上にmain関数をもって行けば早い話であって、
関数を変えた時にプロトタイプ宣言を変え忘れて、
コンパイラが通らないと言う事も起きたりするので
別に必要ないんじゃ無いかと思ったりしてるからです。
0497デフォルトの名無しさん2006/11/20(月) 22:34:33
別にしなくていいよ。
そのうちソースとヘッダを分けることを覚えたら、自然と気にならなくなるだろうし。
0498デフォルトの名無しさん2006/11/21(火) 00:58:36
コンソールで動く、簡単なシューティングゲームを作りたいのですが、
リアルタイムにキー操作を取るにはどうすればいいんでしょうか。

scanfなどでは入力待ち状態になってしまいますし・・
0499デフォルトの名無しさん2006/11/21(火) 01:00:05
環境依存だけど
kbhit
getch
で調べてみれば?
0500デフォルトの名無しさん2006/11/21(火) 01:04:06
>>498
正直、Windowsで作ってるなら、ライブラリを使ったGUI方がはるかに楽だよ。
コンソールは面倒。
たぶん、Win以外もライブラリ使用のほうがらくだと思う。
0501デフォルトの名無しさん2006/11/21(火) 01:08:13
問題はライブラリの使い方を覚えるのが面倒だという可能性があること。
それを乗り越えれば、楽だろうけど。
0502デフォルトの名無しさん2006/11/21(火) 01:10:34
>>498 サンプルコード
#include<stdio.h>
#include<conio.h>

intmain(void){
intmoji='-';

while(1){
if(kbhit())moji=getch();
printf("\r%c [%3d]", moji, moji);
}
return 0;
}
0503デフォルトの名無しさん2006/11/21(火) 01:12:45
上の方でも出てる、DxLibなんかは、かなり簡単。
2chからリンクするのは気が引けるが
初心者からそこそこの上級者までお勧めできる。
(ただ、なんでもかんでもintが活躍するので、少し危険性も高いが)
0504デフォルトの名無しさん2006/11/21(火) 01:20:00
みなさんどうも!

if(kbhit()){
 switch(getch()){
 case 75: //キー入力は左カーソル
printf("left");
break;
 case 77: //キー入力は右カーソル
printf("right");
         break;

case 32://キー入力はスペース
printf("space");
break;
}
}

という感じで出来ました。
コードも載せていただきありがとうございます。
Dxlibも調べてみますね。
0505デフォルトの名無しさん2006/11/21(火) 01:25:08
>>504
カーソルキーは一回押すと二つコードが送られるよ
自分で試して確認しな
0506デフォルトの名無しさん2006/11/21(火) 01:35:14
以下のような3つのペアの実数をファイルに書き、
それらのペアを配列を使って読んで、
それぞれの四則演算を別のファイルに書き出しなさい。

5.0 3.0
2.5 1.0
4.0 1.5


って課題が授業で出てサッパリわかんなくて困ってるんですが、
どなたか助けていただけないでしょうか?
0507デフォルトの名無しさん2006/11/21(火) 01:36:14
>>506
>>1
05085072006/11/21(火) 01:51:36
>>506 ごめ、別スレと勘違いしてた。
あと、マルチ…
0509デフォルトの名無しさん2006/11/21(火) 11:20:59
構造体を作成して返す定石を教えてください
今は以下のようにしています。関数の戻りで値コピーでなく、ポインタ渡しでやりたいです。

typedef struct tagX01
{
 int val1;
 car *val2;
} *LPX01, X01;

呼び出し

LPX01 x01;

x01 = (LPX01)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(X01));
CreateX01(x01);

BOOL CreateX01(LPX01 target) {
  // ここで値設定
}

この、HeapAllocで領域作っているところを、CreateX01の中に入れたいです。
単に、入れるとx01が初期化されていないとコンパイラが警告してきます。
0510それで判らなきゃ大抵間抜けだ2006/11/21(火) 11:24:35
>>509
下請け関数を先に定義するかプロトタイプ宣言をするかしないとコンパイラが型チェックをしてくれない典型。
先ずはそこからやって味噌。
0511デフォルトの名無しさん2006/11/21(火) 12:27:27
>>510
BOOL CreateX01(LPX01 target) を
BOOL CreateX01(LPX01 *target)とかにしないと作ったやつを返せナインぢゃないですか?
0512デフォルトの名無しさん2006/11/21(火) 12:46:25
>>511
LPX01がポインタ型だから、それは問題ない。

> 単に、入れるとx01が初期化されていないとコンパイラが警告してきます。

挙げてあるコード片はそんな警告が出るようには見えないけどな。
完全なソースを挙げるべし。
05135122006/11/21(火) 12:48:03
あ、勘違いしてた。HeapAlloc()を移動したいのね。
>>511のようにするか、CreateX01()の戻り値をLPX01にするかですね。
0514デフォルトの名無しさん2006/11/21(火) 13:02:49
>>510
>>512-513
ご回答ありがとうございます。
やっぱ、ポインタのポインタを渡さないといけないんですね。ありがとうございました。

typedefでつける銘銘なんですけど、構造体はtag[名前]、構造体へのポインタLP[名前]がWindowsAPIっぽくてかっこいいんですが、
ポインタのポインタは命名せずに*LPX01とかが一般的ですか?SDKのヘッダをLPでGREPしてみましたがそれっぽいのがないです
ポインタのポインタになってるやつはLPVOIDが多い気がしますがいろんな型がかえってくるからかなぁと想像しています
0515デフォルトの名無しさん2006/11/21(火) 13:10:14
>>514
Win32 APIみたいにポインタを「LPほげ」とすること自体が、一般的で
はないし、ダサい。

0516デフォルトの名無しさん2006/11/21(火) 13:13:28
>>515
かっこいいとおもっていたのでキツいです
かっこいいのはどんなかんじですか?例かかっこいいっぽいソースとか教えてもらえないですか。
0517デフォルトの名無しさん2006/11/21(火) 13:21:59
どのようなときに、if-else if 文を
switch 文に変換不可能かを教えて欲しいです。
0518デフォルトの名無しさん2006/11/21(火) 13:41:49
>>516
ある型のポインタにわざわざ型名を割り当てるのは、ポインタであることを見失いやすく却って読み辛くなる。
素直にX01 ** fooで充分だ。

>>517
条件式が定数との一致以外のとき。
#つまり、switchにできる方が例外的。
0519デフォルトの名無しさん2006/11/21(火) 13:59:05
>>517
たとえば、
・条件が複数の変数を参照するとき
・条件が整数の定数ではないとき
・整数で分岐だけど、範囲が広過ぎるとき (i < 0 のような)
0520デフォルトの名無しさん2006/11/21(火) 14:16:01
switch(i < 0 ){
case 0:

break;
default :

}
0521デフォルトの名無しさん2006/11/21(火) 17:57:50
>>518
なるほど。別名をつけるのがすでに間違いなんですね。
WindowsSDKではtypedefで構造体とポインタに別名をつけているのが決まりみたいだったんで、
当たり前だと思ってました。実はWindowsSDKがカッコ悪くて、悪い例だったんですね。レス、ありがとう。
0522デフォルトの名無しさん2006/11/21(火) 18:05:14
すいません。
画面から入力した文字列を逆に表示するというのは
どうやったら表示できますか?
0523デフォルトの名無しさん2006/11/21(火) 18:07:41
逆というのは文字が逆という意味です。
どうやったらできますか?
0524デフォルトの名無しさん2006/11/21(火) 18:08:38
文字が逆ってことは、
Eがヨになるって事?
0525デフォルトの名無しさん2006/11/21(火) 18:47:37
初心者な質問で恐縮ですがお願いします。
c言語でかなりの数の数値計算を行うソフトウェアに挑戦しています。
ただ、それを実行するとメモリのinactiveがドカーンとできてしまい、
プログラムが終了しても大きく確保されたままです。
メモリの動的な確保などはしていません。
これは私のプログラムにマズい部分があるのでしょうか?
それとも問題ないのでしょうか?
0526デフォルトの名無しさん2006/11/21(火) 18:58:34
>>525
Linuxか?
大丈夫、他の用途に使いたくなったらOSが勝手に回収する。
処で、malloc()などを使わないでどうやってメモリを確保しているんだ?
0527デフォルトの名無しさん2006/11/21(火) 19:03:51
>>523
こういう事?
char* reverse(char *s)
{
char t, *l = s, *r = s + (strlen(s) - 1);

if(s == NULL){ return NULL; }
while(l < r){
t = *l;
*l = *r;
*r = t;
++l;
--r;
}
return s;
}
0528デフォルトの名無しさん2006/11/21(火) 19:55:22
>>526
勝手に回収すると聞いてちょっと安心です。
ありがとうございます。
環境は実はMac OSXです...(汗

ええっと。動的な確保自体をやっていないつもりなんです。
(答えになっているのかどうか不安ですが...すみません)
0529デフォルトの名無しさん2006/11/21(火) 20:30:13
1.本当に動的確保をしていないか
 ・ライブラリが内部で動的確保をしている可能性
  例:C標準関数のstrdup
2.巨大な静的又はグローバルな配列を宣言していないか
 ・スタートアップで静的領域に一気に確保される
0530デフォルトの名無しさん2006/11/21(火) 20:38:22
プログラム実行のときにある意味動的に被疑者確保
0531デフォルトの名無しさん2006/11/21(火) 20:48:43
\t はタブ文字,\n は改行文字です.

hogehoge \t hoge \n
と言う文字列(char配列)に"ABC"という文字列を加えて

hogehoge \t hoge \t ABC \n
としたいのですが,hogehoge,hogeの長さが任意のため
どこまでをコピーするのかで困っています.
どのように既述をすれば良いのでしょうか?
よろしくお願いします.
0532デフォルトの名無しさん2006/11/21(火) 21:00:21
strlen()で長さを調べろ。
05335312006/11/21(火) 21:27:26
>>532
こんなことで悩んでいたとはお恥ずかしい.
ありがとうございます.
0534デフォルトの名無しさん2006/11/21(火) 21:29:19
>>529
やべ。まさしく2でした。
でっかいグローバルな構造体の配列がありやす
もっかい勉強し直してきます。
1についても初めて聞きました。勉強になりやした。
ありがとね。
0535デフォルトの名無しさん2006/11/21(火) 21:49:28
文字列を特定の位置から削除したいのですが、どうするのが良いのでしょう?
方法を教えてください。

char string = "ABCDE/FGHIJ";
として
文字列に'/'があったら、それ以降を削除したいのです。

s_point = strstr (string, "/");
*s_point = '\0';

で行けると思っていたのですが、コンパイルにはエラーは
ありませんが、実行するとエラーが出て止まってしまいます。
Borland Cコンパイラ(フリー版)とWin2000で、
DOSプロンプト上での実行です。

何か案がありましたら、よろしくお願いします。
0536デフォルトの名無しさん2006/11/21(火) 21:54:04
char string[] = {"ABCDE/FGHIJ"};
こうすればOK。
0537デフォルトの名無しさん2006/11/21(火) 21:55:01
>>535
char string[] = "ABCDE/FGHIJ";
0538デフォルトの名無しさん2006/11/21(火) 21:55:19
char *string = "ABCDE/FGHIJ";
これじゃ駄目だから間違えるなよ。
たとえ上手く動いてるように見えても絶対駄目だからな。
0539デフォルトの名無しさん2006/11/21(火) 21:55:45
被った。スマソ
0540デフォルトの名無しさん2006/11/21(火) 21:56:59
>>536-538

ごめんなさい。
その部分は書き込みが間違えていて、ちゃんと
char string[] = {"ABCDE/FGHIJ"}; にしていました。

0541デフォルトの名無しさん2006/11/21(火) 21:57:06
>>536,537
どっちが正しいの?
05425352006/11/21(火) 21:58:27
× char string[] = {"ABCDE/FGHIJ"};
○ char string[] = "ABCDE/FGHIJ";

何度もすみません。
0543デフォルトの名無しさん2006/11/21(火) 22:00:54
>>542
上のが正しいだろ。常識的に考えて。
0544デフォルトの名無しさん2006/11/21(火) 22:12:15
>>543
char a[] = {'a','b','c','\0'};
char b[] = "abc";
printf("%s\n%s\n", a, b);
0545デフォルトの名無しさん2006/11/21(火) 22:12:56
>>535
その前後のコードも晒してよ。
それだけじゃ特定できん。
0546デフォルトの名無しさん2006/11/21(火) 22:16:02
#include <stdio.h>
#include <string>
int main(void)
{
char s[] = "abcde/fghij";
char *p = strstr(s, "/");
*p = '\0';
printf("%s\n", s);
return 0;
}
0547デフォルトの名無しさん2006/11/21(火) 22:23:24
>>544
お前は何を言っているんだ。
05485352006/11/21(火) 22:25:08
すみません。
問題は別のところにありました。
strstrで検索したときに、検索文字列のひとつに
"/"がなくNULLを返していたのが原因でした。
ifとかを付けずに *s_point = '\0'; としてしまい、
そこでエラーを起こしていました。

お騒がせして申し訳ありませんでした。
0549デフォルトの名無しさん2006/11/21(火) 22:28:05
>>547
あんたは何を言ってるの?
0550デフォルトの名無しさん2006/11/21(火) 22:28:09
char a[] = {'a','b','c','\0'};
char b[] = {"abc"};
printf("%s\n%s\n", a, b);
0551ぴゅあ2006/11/21(火) 22:32:29
>>544のでいいと思うんだけど…

>>535
>エラーが出て
というのがエラーメッセージが出ているのなら
それを示した方が良かったかもですね
0552デフォルトの名無しさん2006/11/21(火) 22:41:07
>>551
質問者は
"ABCDE/FGHIJ"
これの/以降を削除したいと言っている
コンパイルの段階で分割してどうするね・・・
0553デフォルトの名無しさん2006/11/21(火) 22:48:41
>>552
ttp://www.konaken.com/blog/milco.jpg
0554ぴゅあ2006/11/21(火) 22:51:42
>>552
あぁ 構文ではなくて"abc"とされていたことを言っていたわけですか
(てか、それなら"ABCDE"とかだろうけど)

>"ABCDE/FGHIJ"
にならうなら
char a[] = {'A','B','C','C','D','E','/','F','G','H','I','J','\0'};
char b[] = "ABCDE/FGHIJ";

後者に括弧は要らんでしょう

char c[][] = {"ABC","DEF"};
とかなら。。。
0555ぴゅあ2006/11/21(火) 22:53:27
あれ?最後のは要素数要ったかな
或いはchar *[]か
0556デフォルトの名無しさん2006/11/21(火) 22:57:30
>>555
いる。
0557デフォルトの名無しさん2006/11/21(火) 22:59:26
キメーから括弧付けろよ。
0558デフォルトの名無しさん2006/11/21(火) 23:01:20
542 :535:2006/11/21(火) 21:58:27
× char string[] = {"ABCDE/FGHIJ"};
○ char string[] = "ABCDE/FGHIJ";

何度もすみません。

543 :デフォルトの名無しさん :2006/11/21(火) 22:00:54
>>542
上のが正しいだろ。常識的に考えて。

544 :デフォルトの名無しさん :2006/11/21(火) 22:12:15
>>543
char a[] = {'a','b','c','\0'};
char b[] = "abc";
printf("%s\n%s\n", a, b);
0559ぴゅあ2006/11/21(火) 23:03:33
>>557
貴様の指図は受けん!
0560ぴゅあ2006/11/21(火) 23:05:55
>>557
"ABC"はchar配列として扱うから
付けない方が一般的だと思いますよ

>キメー
の意味は判らないけど…
0561デフォルトの名無しさん2006/11/21(火) 23:08:52
まあ、カッコは付けたほうが見た目には綺麗だよな。
客観的に考えて。
0562ぴゅあ2006/11/21(火) 23:11:26
>>561
それはお前の主観だろ。
0563ぴゅあ2006/11/21(火) 23:13:17
543 :デフォルトの名無しさん :2006/11/21(火) 22:00:54
>>542
上のが正しいだろ。常識的に考えて。


上のが正しいだろ。常識的に考えて。

上のが正しいだろ。常識的に考えて。
上のが正しいだろ。常識的に考えて。


ttp://www.konaken.com/blog/milco.jpg
0564ぴゅあ2006/11/21(火) 23:13:40
>>561
コンパイラが要素数1の配列として誤解しないか
ちょっと気になりました
(コード読む側も間違えないのかな?)

ついでがあったら確認してみよ。。。
0565デフォルトの名無しさん2006/11/21(火) 23:44:51
質問です。
今授業で char を使い始めました。
さっそくこれを使って2〜16進数を4進数や8進数に直せというPを作れといわれたのですが、
char に自由な数値を入れるにはどうしたらいいのでしょうか?

int なら 
int a;
scanf("%d",&a);
でいけますよね?

先生曰く char と int は1ビットと4ビットでサイズが違うのでscanfは使えないと言っていた気がするし、
実際scanfを使ったPを作ってもコンパイルできません。

どうか回答よろしくお願いします。
0566デフォルトの名無しさん2006/11/21(火) 23:49:07
宿題は宿題スレへ
0567デフォルトの名無しさん2006/11/21(火) 23:51:13
代入を使うといい。
char c, d, e;
c = 1;
d = 100;
e = 25;
0568デフォルトの名無しさん2006/11/21(火) 23:51:49
ものすごく香ばしいような気がするのは気のせいではない
0569デフォルトの名無しさん2006/11/22(水) 00:56:35
>565
言いたいことはいろいろあるが、とりあえず。
Pとは何だ?
その先生とやらが教えてくれたのか、君が勝手に言い出したかは知らないが、
そんな言葉は一般的に通じない。
人に質問するときは相手に分かるように話せ。


0570デフォルトの名無しさん2006/11/22(水) 00:57:38
10進数の1から10を,2進数に変換するプログラムを作っています。
Num2 = 0,i = 1に初期化しています.

for (Num10 = 1; Num10 <= 10; Num10++)
   {
      while (Num10)
      {
         if (Num10 % 2 == 1)
            Num2 += i;
         i *= 10;
         Num10 /= 2;
      }
      printf("%05d", Num2);
   }

これで実行すると,意味不明な(-954437117)という数字が無限ループしてしまいます.
指摘してくださる方いましたらよろしくお願いします.
0571デフォルトの名無しさん2006/11/22(水) 01:03:46
forループにNum10を使っているんだから、
ループ内でNum10を書き換えたらきちんとループできないだろ。
プログラムの是非は問わないことにする。
0572デフォルトの名無しさん2006/11/22(水) 01:14:57
>>570
for(NUM10=1; NUM10<=10; NUM10++) {
 NUM2 = 0;
 i = 1;
 j = NUM10;
while(j) {
  if(j%2) NUM2 += i;
  i *= 10;
  j /= 2;
 }
 printf("%d,%d\n",NUM10, NUM2);
}
こういうことがやりたいの?
0573デフォルトの名無しさん2006/11/22(水) 01:15:34
>>571
while開始前に,Num10の内容を別の変数aに代入し
プログラムを実行させたところ無限ループはなくなりました.
2進数変換は正しく出来ていなかったので考えてみることにします.

ありがとうございました.
0574デフォルトの名無しさん2006/11/22(水) 01:19:32
>>572
iとNum2をfor文の外で初期化していたため,10進数の2以上がおかしい値となっていました。
ありがとうございます.
0575ぴゅあ2006/11/22(水) 01:34:05
>>574
折角、できたということなので
後で改めて考えてみるとかでいいと思いますけど
2進や8進とかにするというのは文字/文字列にすることを
考えてみるのもいいかも
(8進,16進はわざわざロジックを組まなくてもできたりですけど)

若干コードは面倒臭くなるかもですけどね
8/10/16進も敢えてやってみておいてもいいかも
05765742006/11/22(水) 02:00:46
>>575
文字/文字列とはどういうことでしょうか?

8,16進はprintf内で出来るので敬遠していました.
今は勉強を始めたばかりですので,敬遠せず色々とやってみたいと思います.
0577ぴゅあ2006/11/22(水) 07:48:26
>>576
>文字/文字列とはどういうことでしょうか?
sprintf(メモリ,printf/fprintf(標準出力/ストリーム)で
結果を出そうとするとき、いずれも結局は文字列ですよね

2進(>>572)を例に採ると"j%2"或いは"j&(2-1)"は数値で0か1
これに文字'0'か文字コード0x30を加えれば文字'0'か'1'
これをprintfで書式"%c"を使えば文字列"0"か"1"として表示される

>>572をなるべく変えないでやろうとするなら
まずその文字列分のメモリ域を確保・初期化しておいて
先に求めた'0','1'を1の位(のメモリ位置)から埋めていく
全て揃ったらprintfなりで文字列(書式"%s")として出力

それが形になれば8/10/16進も同様(2/8/10/16進の違いの部分だけ)
符号の有りは別途後でやってみるのがいいと思うけど

printfの中もこういうことやってたりします
(>>572の例だと一度10進数(int)として扱えるように置き換えているから
桁数に限界がでてきたりするでしょ?)
0578デフォルトの名無しさん2006/11/22(水) 07:52:17
C言語で文字コード変換てどうすればいいでしょうか
0579ぴゅあ2006/11/22(水) 07:54:19
あぁ 文字/文字列の扱い,メモリ操作とかまだ難しいと思えるなら
その辺りも勉強するまで置いといて
後でゆっくりやってみるのがいいと思います
0580ぴゅあ2006/11/22(水) 07:56:21
>>578
文字列の中から1文字取り出したcharの値が文字コード
後は文字コード表と見比べれば
0581ぴゅあ2006/11/22(水) 08:41:24
あ… 文字コード"変換"て、そういう意味で聞いたのではないのかな
(>>577繋がりかと思ってしまいました。。。)
■ このスレッドは過去ログ倉庫に格納されています