C言語なら俺に聞け(入門篇) Part 4
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/09(木) 00:31:01・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/
0232デフォルトの名無しさん
2006/11/14(火) 04:13:19日本語で書いて
それだけじゃ意味わからんぞ
0233デフォルトの名無しさん
2006/11/14(火) 04:37:06サンクスです。
どうして、*が付くとそう書けるのかがわかりません
0234デフォルトの名無しさん
2006/11/14(火) 04:37:49メモリはどうなるのか教えてください。
あと、絶対にほかのプログラムのメモリにはアクセスできない
のでしょうか?
というか、Cの質問じゃないですかね?
0235デフォルトの名無しさん
2006/11/14(火) 04:46:400236デフォルトの名無しさん
2006/11/14(火) 06:05:16メモリが予約されるが、その中に何が入っているかは未定。
前そのメモリ空間を使っていた変数の値がその領域にのこったまま
だったらそれがそのままその領域に残ってる(初期化してくれない)
したがって宣言時に予約した領域に無意味な値を入れて安全にする
(初期化)ことが重要な場合が・・ある
0237デフォルトの名無しさん
2006/11/14(火) 07:40:34int foo = 5;と書いて
int fooz[] = {1, 2, 3, 4,};と書くが如く、
char * bar = "aho";と書いて
char * barz[] = {"tako", "ika", "kurage",};と書く。
0238デフォルトの名無しさん
2006/11/14(火) 07:41:51今時のコンパイラはインライン展開もするから、下手な小細工考えずに関数で書け。
そしてその関数だけでなくプログラム全体でプロファイリングしろ。
話はそれからだ。
0239デフォルトの名無しさん
2006/11/14(火) 08:30:14226です。ありがとうございます!
インライン展開、プロファイリングという言葉を初めて知り、
調べることが出来ましたyo
0240デフォルトの名無しさん
2006/11/14(火) 08:35:34数値を指定桁数まで右スペース埋めしたいのですがどのように書けば良いのでしょうか?
左埋め… printf("%4d",10)→" 10"を出力
右埋め… printf("?",10)→"10 "を出力
�Aまた、上記の桁数(4)も動的に指定するにはどのように書式を指定すれば良いのでしょうか?
よろしくおねがいします。(性的な意味で)
0241デフォルトの名無しさん
2006/11/14(火) 08:57:38printf("%-*d", 4, 10);
0242デフォルトの名無しさん
2006/11/14(火) 09:12:000243デフォルトの名無しさん
2006/11/14(火) 10:13:510244デフォルトの名無しさん
2006/11/14(火) 15:37:33n×nのサイズで螺旋状に0から(n二乗ー1)までの数が並ぶ行列を作成し、
画面に表示させるプログラムって配列を使って組むにはどうすればいいでしょうか?
ヒントだけでもいいので教えてください。お願いします。
0245デフォルトの名無しさん
2006/11/14(火) 15:43:52宿題スレにでも行ったら?
0246デフォルトの名無しさん
2006/11/14(火) 18:29:280247デフォルトの名無しさん
2006/11/14(火) 18:35:33typedef unsigned long (*function_ptr)(int, long, long);
のようにね。
0248デフォルトの名無しさん
2006/11/14(火) 19:38:4316進以外が途中に入力されたらエラーを出力したいのですが、何か良い方法はありますか?
0249デフォルトの名無しさん
2006/11/14(火) 19:39:450250デフォルトの名無しさん
2006/11/14(火) 19:40:13馬鹿だなぁ
タッチパネルに決まってるだろ?
0251デフォルトの名無しさん
2006/11/14(火) 19:47:26改めて質問させて下さい。コピペになりますが、よろしくお願いします。
グーグル先生に質問してみたのですがよくわかりませんでした・・orz
宜しければ詳しく教えて欲しいのですが。
C++にて、テキストファイルに書き込まれたデータを構造体に格納する方法です。
データは一行につき1件で、カンマで区切られて4つの項目があります。
char型が2つとint型が2つになります。
データは10件(行)あります。
よろしくお願いします(´・ω・`)
0252デフォルトの名無しさん
2006/11/14(火) 19:55:520253デフォルトの名無しさん
2006/11/14(火) 19:57:280254デフォルトの名無しさん
2006/11/14(火) 20:04:51>C++にて
スレ違い。
>テキストファイルに書き込まれたデータ
>char型が2つとint型が2つ
それはテキストファイルではない。
0255デフォルトの名無しさん
2006/11/14(火) 20:07:32すいません、Cでお願いします。
書き方が悪かったです。
文字列,文字列,数字,数字
という構造になっているので、構造体の宣言でchar型を2つとint型を2つ用意する必要があるという事を言いたかったんです
0256デフォルトの名無しさん
2006/11/14(火) 20:08:12man fscanf
0257デフォルトの名無しさん
2006/11/14(火) 20:09:53文字列は(char型)配列に格納してください。
0258デフォルトの名無しさん
2006/11/14(火) 21:13:500259デフォルトの名無しさん
2006/11/14(火) 21:41:39struct xxx {int *x;} hoge;
struct yyy {void *x;};
struct yyy *piyo = (struct yyy *)&hoge;
return 0;
}
これはコンパイルが通ったのですが、四行目を
struct yyy piyo = (struct yyy)hoge;
とすると型変換できませんとエラーが出ます、何故でしょうか?
0260デフォルトの名無しさん
2006/11/14(火) 22:02:56(struct yyy)hoge
このキャストは無理
0261デフォルトの名無しさん
2006/11/14(火) 22:03:160263デフォルトの名無しさん
2006/11/14(火) 22:09:34君は http://pc8.2ch.net/test/read.cgi/tech/1160893851/588 かな?
http://pc8.2ch.net/test/read.cgi/tech/1160893851/595
の左辺のキャストを よーーーく見よう C にはない文法の (struct hoge &) ってキャストしてっから。
これは 構造体自体のキャストでは無い
0264259
2006/11/14(火) 22:19:22同じ日に…いえ、その人は別の方です
C++でも構造体をキャストできているわけでなないんですね
可能だとしても意味はほとんどないんでしょうけれど、疑問に思ったので…
(メンバーの数が違っても)構造体のポインタはキャスト可能ということは
領域破壊でバグの原因になったりしそうでどっちにしろ危険っぽいですね
ありがとうございました
0265デフォルトの名無しさん
2006/11/14(火) 22:22:36struct XXX *p <-> void *p
くらい
0266デフォルトの名無しさん
2006/11/14(火) 22:36:41じゃあ自分のレベルではまだ使うこともなさそうですね
0267デフォルトの名無しさん
2006/11/14(火) 22:38:38まま、そうおっしゃらずに。
実はいける口なんでしょ?
0268デフォルトの名無しさん
2006/11/14(火) 22:40:31int length;
char data[1];
}string;
struct{
int length;
char data[buf_size];
}a;
のとき
(string)a
のようにキャストするのもテクニックとしては知っておいたほうがいいかも
0270デフォルトの名無しさん
2006/11/14(火) 23:02:2516進以外が途中に入力されたらエラーを出力したいのですが、何か良い方法はありますか?
気になって眠れません。
0271デフォルトの名無しさん
2006/11/14(火) 23:07:29どこまで変換したかってポインタが設定されるから、それを見たら?
途中で止まってたらおかしい。
0272デフォルトの名無しさん
2006/11/14(火) 23:08:03>249
0273デフォルトの名無しさん
2006/11/14(火) 23:19:07第一引数は配列名で第三引数は基数、第二引数をみるのですか?
0274デフォルトの名無しさん
2006/11/14(火) 23:21:09そう。
0275デフォルトの名無しさん
2006/11/14(火) 23:49:34268ではないが。
C言語ではコンパイル時に配列のサイズが決まっている必要があるが、
サイズを動的に変えられる(かのように扱える)構造体を使うためのテクニック。
配列のサイズは固定なので、基本的に最大の要素数を格納できるような
型を用意しておく必要がある。これでは、要素数の少ないデータしか
格納しない場合に無駄が多い。
よって、ケースバイケースで配列の要素数の異なる型が使えると嬉しい。
以下のようにすれば任意の要素数の配列として動的に確保できる。
string *p;
int size = 30;
p = (string *)malloc(sizeof(string) + sizeof(char)*(size - 1);
p->length = size;
この構造体を操作するときは、配列部分のサイズが固定じゃないから、
lengthメンバのようにどこかで配列サイズを保持しておき、
その分だけをアクセスするようにすればいい。
void func(string *pstr)
{
int i;
for(i = 0 ; i < pstr->length ; i++) {
printf("%c", toupper(pstr->data[i]);
}
}
当然、構造体の最後のメンバにしか適用できない。
0276デフォルトの名無しさん
2006/11/14(火) 23:55:26仕様書に違反している事には変わりがないけどな。
使うときは自己責任でって奴だ。
C99ではchar data[]って書き方が正式に許されたが。
0277デフォルトの名無しさん
2006/11/15(水) 00:33:05ま、いっか。
0278デフォルトの名無しさん
2006/11/15(水) 02:04:53どういう事なのでしょうか?入門書の説明が難しくて
わかりません。
あと、コメントが文字列なので2次元配列は、
どうして使えないのでしょうか?
0279デフォルトの名無しさん
2006/11/15(水) 02:39:53例えば学校で40人のクラスが5クラスあったとする。
その場合
int data [5][40];
とかになる
>あと、コメントが文字列なので2次元配列は、
>どうして使えないのでしょうか?
これは言ってる意味がわからない
0280デフォルトの名無しさん
2006/11/15(水) 02:59:43もしかして二次元配列とポインタの関係がわからなくて悩んでいるのか?
最初はポインタ無視していいよ。>>279の通りでいい。
>コメントが
これは俺も不明な質問だが、文字列の二次元配列という意味なら、文字列
そのものが既にchar型の一次元配列なので、1+2=3次元配列が必要になる。
例えば
char [][2][10] = {{"orange", "apple"}, {"banana", "pine"}};
のような感じで。
0281278
2006/11/15(水) 03:07:40わkりました!!
>>280->>279
>>コメント
入門書にも詳しく書かれていないので、
自分でもよくわかりません、すんまそ。
>>char [][2][10] = {{"orange", "apple"}, {"banana", "pine"}};
のような感じで。
難しいです・・・まだここまで習っていないので参考にさせて
戴きます、頭が混乱するといけないので。
ありがとうございました。
0282デフォルトの名無しさん
2006/11/15(水) 03:51:46#include <time.h>
#include <stdlib.h>
//すごろくマップの構造体
struct board{
int p;//進む数
int h;//休む回数
char comment[128];
};
int p_position = 1; //プレイヤーの現在位置
int max = 10; //マップの全駒数
void writeBoard(void);
0283デフォルトの名無しさん
2006/11/15(水) 03:52:25int player; //プレイヤーのサイコロの目
int add; //止まった駒の進む数を格納する
struct board sugoroku[] = {
{0,0,"スタート"},
{0,0,"2駒目"},
{0,0,"3駒目"},
{3,0,"4駒目。3つ進む"},
{-2,0,"5駒目。2つ戻る"},
{0,0,"6駒目"},
{1,0,"7駒目。1つ進む"},
{0,0,"8駒目"},
{0,0,"9駒目"},
{-4,0,"10駒目。4つ戻る"}
};
printf("【すごろく】\n");
srand(time(NULL));
for(;;){
//サイコロを振る
printf("\nプレイヤーの番です。サイコロを振る > ");
while(getchar() != '\n'){}
player = rand()%6 + 1;
0284デフォルトの名無しさん
2006/11/15(水) 03:53:05p_position += player;
printf("目:%d\n",player);
if(p_position > max){break;}
//追加移動
do{
add = sugoroku[p_position-1].p;
printf("%s\n",sugoroku[p_position-1].comment);
p_position += add;
}
while(add != 0);
if(p_position > max){break;}
//現在位置の表示
printf("現在位置%d / %d\n",p_position,max);
writeBoard();
}
printf("あがり\n");
return 0;
}
0285デフォルトの名無しさん
2006/11/15(水) 03:54:41void writeBoard(void){
int i;
for(i = 0; i < max; i++){
if(i == p_position-1){
printf("プ");
}
else{printf("□");}
}
printf("\n");
}
これで、合っていますが疑問があります。
>>[p_position-1]
で、-1と言うのが疑問です。何から-1にしているのでしょうか?
0286デフォルトの名無しさん
2006/11/15(水) 04:18:00質問に愚直に答えるなら、
p_positionから-1にしている。
日本語が不自由な君に軽くエスパーを駆使すると
配列の添え字が0から始まるのに対し、
p_positionは1から始まっているから。
0287デフォルトの名無しさん
2006/11/15(水) 05:09:17謎がとけました、サンクスです
0288デフォルトの名無しさん
2006/11/15(水) 06:14:44ありがとうございます
0289259
2006/11/15(水) 07:16:45あ、(string)aというのは本当にそのままキャストするってことではなくて
領域についてこういう風な考え方もできるから知っておくといいという意味でしたか
現場ならではって感じですね、ありがとうございました
0290デフォルトの名無しさん
2006/11/15(水) 11:20:55printfの%sに対して数値の0を渡したら、
文字化けやエラーではなく「(null)」という文字列が表示されました。
0292デフォルトの名無しさん
2006/11/15(水) 11:43:05%s
0293デフォルトの名無しさん
2006/11/15(水) 11:58:590294デフォルトの名無しさん
2006/11/15(水) 12:05:590 == "\0" は真だろ。
無知はお前の方だろww
0295デフォルトの名無しさん
2006/11/15(水) 12:33:00環境依存。
未定義の動作だから処理系によって動作は違がう。
その例は単なるフェイルプルーフだからその動作を期待してはいけない。
0296デフォルトの名無しさん
2006/11/15(水) 12:56:190298デフォルトの名無しさん
2006/11/15(水) 13:48:45を作りたいんですけど、どうすればいいですか?
自分は
char str[6];
int i;
for (i=0;i<6;i++)
{
str[i]="文字列"[i];
}
printf("%s\n",str);
return 0;
}
こういう奴をいじっていくつもりなんですけど。
0299デフォルトの名無しさん
2006/11/15(水) 13:53:350300デフォルトの名無しさん
2006/11/15(水) 14:02:54#include <string.h>
#include <stdlib.h>
char* reverse(char str[]) /* return NULL if error */
{ int i, len=strlen(str); char* buf;
if ((buf=(char*)calloc(sizeof(*buf), len)) == NULL) return NULL;
for (i=0; i<len; i++) buf[i]=str[i]; for (i=0; i<len; i++) str[i]=buf[len-1-i];
free(buf); return str; }
0301デフォルトの名無しさん
2006/11/15(水) 14:07:18unkoだったらoknuって出るようにします
>>300
すいません、まだポインタ習ってないです。
0302デフォルトの名無しさん
2006/11/15(水) 14:08:01予習になったね
0303デフォルトの名無しさん
2006/11/15(水) 14:14:30printf("oknu");
0304298
2006/11/15(水) 14:16:45ポインタ無しで>>298を(逆順の定義は>>301)解決したいです
どなたかお願いします。
文字列の連結やらコピーをするくらいまではなんとかできます。
0305デフォルトの名無しさん
2006/11/15(水) 14:23:38てことは、>>298の "文字列" ってのが
"列字文" ってならなくてもいいんだな?
0306298
2006/11/15(水) 14:26:38それは困ります><
できたらできたほうがいいです
0307298
2006/11/15(水) 14:32:49>>301は だったら って書いたので例えのことです。
これだったら>>1でいう詳しく書いたことにならないようなので、
言い直すと入力した文字の後から1つ1つ順番に出力したいです。
0308デフォルトの名無しさん
2006/11/15(水) 14:35:400309デフォルトの名無しさん
2006/11/15(水) 14:41:150310デフォルトの名無しさん
2006/11/15(水) 14:46:540311298
2006/11/15(水) 14:48:15すいません、それすら知りませんでした。
>>308
>>298は課題が出たからわからないので聞きにきたんですが、
問題の内容にすら書いていません。今までの課題の流れだと日本語を入力したことがないので
流れから判断して多バイト文字は無視でお願いします。
0312デフォルトの名無しさん
2006/11/15(水) 14:52:55しかし汚いコードでつね
0313デフォルトの名無しさん
2006/11/15(水) 15:38:390314デフォルトの名無しさん
2006/11/15(水) 15:44:12int i,k=6;
for (i=0;i<6;i++)
{
str[i]="文字列"[k--];
}
printf("%s\n",str);
return 0;
はいはい俺天才
0315デフォルトの名無しさん
2006/11/15(水) 15:45:40つ\0
0316デフォルトの名無しさん
2006/11/15(水) 15:48:26え、、えへへ
0317デフォルトの名無しさん
2006/11/15(水) 15:51:31いや、大きさが足りない
(男の人に言ったらまずかった?)
0318デフォルトの名無しさん
2006/11/15(水) 15:52:080319デフォルトの名無しさん
2006/11/15(水) 15:53:240320デフォルトの名無しさん
2006/11/15(水) 15:55:520321デフォルトの名無しさん
2006/11/15(水) 16:30:370322大学生
2006/11/15(水) 22:26:24「問題17」πの値を実数として計算し表示せよ。
「問題18」eの値を小数点以下60桁まで求めよ。
「問題19」πの値を小数点以下60桁まで求めよ。
この問題16.17.18、19のC言語プログラム(C++)でお願いします。
それと多倍長少数を利用して作ってください。
0323デフォルトの名無しさん
2006/11/15(水) 22:28:34C/C++の宿題を片付けます 76代目
http://pc8.2ch.net/test/read.cgi/tech/1162771475/
0324デフォルトの名無しさん
2006/11/15(水) 23:49:40いろんなところでとりあえずこれでやってみれと書いてある
Win32コンソールアプリケーションで作ると追加できるソースファイルが*.cppです
とりあえずHelloWorld!は出たんですが
*.cファイルが追加できるように設定しといた方がいいんでしょうか?
0325デフォルトの名無しさん
2006/11/15(水) 23:57:590326デフォルトの名無しさん
2006/11/16(木) 00:15:230327327
2006/11/16(木) 03:22:17その書き換えかたがわかりません。教えていただけませんでしょうか><;
以下のように記述していまして、c(文字型)の部分に整数を入れたいんです。
while((c = fgetc(fp)) != EOF)
{
if(c == '特定の文字')
{
//ここがわかりません
}
}
0328デフォルトの名無しさん
2006/11/16(木) 03:36:04f = ftell();
fseek(fp, 0, SEEK_CUR);
fputc(c, fp);
つまり"r+"で開いたファイルは、fseek()すればそのすぐ次には書いてもよい。
一度でも書いたらまたfseek()もしくはrewind()しないと読めない。
0329デフォルトの名無しさん
2006/11/16(木) 03:37:18{
if(c == '特定の文字')
{
c = 15; //任意の整数
}
}
0330デフォルトの名無しさん
2006/11/16(木) 03:38:590331デフォルトの名無しさん
2006/11/16(木) 03:45:48おまえ日本語読めないのか?
>>327はそんなこと望んでないぞ。
>>329が正解だろ。
■ このスレッドは過去ログ倉庫に格納されています