C/C++の宿題を片付けます 75代目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/10/19(木) 20:39:01【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して
投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。
【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
[3.1] OS: (Windows/Linux/等々)
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
[3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
【C 関数検索 man on WWW】
http://www.linux.or.jp/JM/index.html
【前スレ】
C/C++の宿題を片付けます 74代目
http://pc8.2ch.net/test/read.cgi/tech/1158844912/
【過去スレ一覧】
http://makimo.to/cgi-bin/search/search.cgi?q=C%2B%2B%82%CC%8Fh%91%E8&andor=AND&sf=2&H=&view=table&D=tech&shw=2000
0052デフォルトの名無しさん
2006/10/21(土) 11:39:25int * arr[]はintのptrの配列ですよね?
0053デフォルトの名無しさん
2006/10/21(土) 11:41:590054デフォルトの名無しさん
2006/10/21(土) 11:55:000055デフォルトの名無しさん
2006/10/21(土) 11:57:48おまけ #define 無しで顔文字プログラム
main(){int i,l,o,P;
l^o^l/
(o-o)?
:-P
;
}
0056デフォルトの名無しさん
2006/10/21(土) 12:04:24[2] 問題文:各種ソートやサーチのプログラムを比較する
[3] 環境
[3.1] OS:suse Linax
[3.2] コンパイラ名とバージョン:gcc
[3.3] 言語:C
[4] 期限: 11月中ですが実行して比較するのでもう少し余裕が要る
[5] その他の制限:特になし
#include <stdio.h>
void linear(int t,int num,FILE *fp) ;
int main(){
int t,num;
char name[256];
FILE *fp;
printf("Put target file of sarch\n");/*検索するファイル名を入力*/
scanf("%s",&name);
fp=fopen(name,"r");
if(fp==NULL){/*ファイルオープンに失敗*/
fprintf(stderr,"file open error!!\n");
return 1;
}
fscanf(fp,"%d",&num);/*乱数の個数を読み込む*/
printf("put target number\n");/*検索する目的の値を入力*/
scanf("%d",&t);
|
|後略
|
これが動くのに
005756
2006/10/21(土) 12:04:54#include <stdlib.h>
void bynali(int *x,int first,int last,int t,int c);
int main()
{
int num,*arr,i,t;
char name[256];
FILE *fp;
printf("Put sarch file\n");/*検索する対象のデータファイルを入力*/
scanf("%s",&name);
fp=fopen(name,"r");
if(fp==NULL){/*ファイルオープンに失敗*/
fprintf(stderr,"file open error!!");
return 1;
}
printf("put target number\n");/*検索する目的の値を入力*/
scanf("%d",&t);/*ここでセグメンテーションフォルト*/
|
|後略
|
これがセグメンテーションフォルトになってしまう理由がわかりません。
005856
2006/10/21(土) 12:08:53void BubSort(int *x);
int main(void)
{
int *arr,num,i;
FILE *fp,*fo;
char name[256];
printf("Put target file of sort\n");/*ソートする対象のデータファイルを入力*/
scanf("%s",&name);
fp=fopen(name,"r");
if(fp==NULL){/*ファイルオープンに失敗*/
fprintf(stderr,"file open error!!");
return 0;
}
printf("Put file name to sort\n");/*ソート結果を出力するファイル名を入力*/
scanf("%s",&name);
fo=fopen(name,"w");
if(fo==NULL){/*ファイルオープンに失敗*/
fprintf(stderr,"file open error!!");
return 0;
}
|
|後略
|
これが動くのに
0059デフォルトの名無しさん
2006/10/21(土) 12:09:41intのptrの配列がこれですね→int (*parr)[4];
intの配列へのptrはこんなん?→int *(arrp [4]);←あり?
実際にはptrのptr→int **ptr で考えるかと思いますが、理屈的なところで。
006055
2006/10/21(土) 12:09:41l^o^l/
(o-o)?
l^w^l
:-P
;}
006156
2006/10/21(土) 12:12:13#include <stdlib.h>
void quick(int *x,int first,int last);
int main()
{
int num,*arr,i;
char name[256];
FILE *fp,*fo;
printf("Put target file of sort\n");/*ソートする対象のデータファイルを入力*/
scanf("%s",&name);
fp=fopen(name,"r");
if(fp==NULL){/*ファイルオープンに失敗*/
fprintf(stderr,"file open error!!");
return 1;
}
printf("Put file name to sort\n");/*ソート結果を出力するファイル名を入力*/
scanf("%s",&name);/*ここでセグメンテーションフォルト*/
|
|後略
|
これがセグメンテーションフォルトになるのがどうしてもわかりません。
しかもquickの方は二つのscanfを入れ替えると必ず二つ目のscanfでセグメンテーションフォルトにな
ります。
なぜセグメンテーションフォルトになるのか、どう対処したらよいのか教えてください。
0062デフォルトの名無しさん
2006/10/21(土) 12:21:12エスパー回答
arr の領域を確保せずに使用して、変なアドレスを破壊しようとしてる。
おそらくセグメンテーションフォルトはあなたが思っているところでは起こっていない。
コードを全て晒してください。
0063デフォルトの名無しさん
2006/10/21(土) 12:39:49printf("abc") を呼んだからといって、
すぐに "abc" が画面に表示されるわけではない。
>>56 は、そこまでは表示されていたから、
その直後でセグメンテーションフォルトが起こったと
思っているのだろう。
恐らく、
|
|後略
|
のところにバグがある。
0064デフォルトの名無しさん
2006/10/21(土) 12:40:21>>62と同じ意見
後略の部分をコメントアウトしても落ちるかどうか位のチェックはしたほうがいい
0065デフォルトの名無しさん
2006/10/21(土) 13:06:23>scanf("%s",&name);
配列の先頭のポインタのポインタを渡してる気がする
0066デフォルトの名無しさん
2006/10/21(土) 13:10:41そこも確かに意味としては間違ってる
でもこのコードだと値としては &name[0]=name=&name
になると思う。
006756
2006/10/21(土) 13:13:45確かにその後をコメント化したところ正常に終了しました。
が、どこが原因なのかが全くわかりません。
1のロダが死んでるみたいなんで別ロダに上げたソース↓
http://kossie.run.buttobi.net/cgi-bin/up/src/kos0002.txt
0068デフォルトの名無しさん
2006/10/21(土) 13:21:24for(i=0;i<num;i++){
fscanf(fp,"%d",arr[i]);/*配列にデータを格納*/
}
arr[i] の前に & が無い
0069デフォルトの名無しさん
2006/10/21(土) 13:26:13そうだったのか
無知ですまんかった
0070デフォルトの名無しさん
2006/10/21(土) 13:27:45リンクエラーになってる
0071デフォルトの名無しさん
2006/10/21(土) 13:29:12ソースがもう見れない
>>68がもう答えだしてるみたいだけど、
コメントアウトして正常動作したなら、そのコメント部分の処理が怪しいだろう
1行ずつ削るなり増やしていけば大抵バグは見つかる
0072デフォルトの名無しさん
2006/10/21(土) 13:31:13このコードでのセグメンテーションフォルトの原因にはなりませんが、
誤作動の元になるので、危険なことには変わりないです。
(name を動的割り当てに変更したときとか)
要するにバグですね
0073デフォルトの名無しさん
2006/10/21(土) 13:45:06逆。
int (*parr)[4];とすると、parrはint [4]へのポインタ。
int *(arrp[4]);とすると、arrpはint *の配列(4要素)。
int (*parr)[4];という宣言は、括弧にしたがって、
「parrをまず*で逆参照し、その結果に対して[]でwアクセスすると、intが得られる」
と読むべし。
0074デフォルトの名無しさん
2006/10/21(土) 13:47:04__FILE__ __LINE__
使い方
#include<stdio.h>
#define DEBUG 1
#if DEBUG
#define debug_print(msg) fprintf(stderr, "File:%s Line:%d %s\n", __FILE__, __LINE__, msg)
#else
#define debug_print(msg)
#endif
int main(void)
{
debug_print("debug1");
debug_print("debug2");
return 0;
}
__VA_ARGS__ マクロが使えるコンパイラならもっと便利にできるよ
0075デフォルトの名無しさん
2006/10/21(土) 14:39:29ありがとうございます。こんな理解でいいですね?
#include<stdio.h>
int main(void){
int arr[]={1,2,3,4,5};
int *parr=arr; //pointer of array
int *a, *b, *c , *d , *e;
a=arr;
b=++arr;
c=++arr;
d=++arr;
e=++arr;
int *arrp[]={a,b,c,d,e}; // array of pointer
for(int i=0; i<5; i++){
printf("%d\n", arr[i]);
}
for(int i=0; i<5; i++){
printf("%d\n", *parr++);
}
for(int i=0; i<5; i++){
printf("%d\n", *(*arrp)++);
}
}
0076デフォルトの名無しさん
2006/10/21(土) 14:53:15良くない。
>int *parr=arr; //pointer of array
これではparrはintへのポインタだし、
arrではなくarrの先頭要素を指している。
arrへのポインタが欲しいなら、
int (*parr)[5] = &arr;
とするw。
0077デフォルトの名無しさん
2006/10/21(土) 15:12:13int arr[5];のとき、arrと&arrの区別が付きません。中身は両方とも
arrの先頭アドレスかと思います。
arr=&(arr[0])で配列の先頭要素へのポインタであり、&arrはarrそのもの
へのポインタということですか?
0078デフォルトの名無しさん
2006/10/21(土) 15:27:21あれほど言っているでしょうに?
0079デフォルトの名無しさん
2006/10/21(土) 15:31:56がんばれ
0080デフォルトの名無しさん
2006/10/21(土) 15:33:59の
ttp://www9.plala.or.jp/sgwr-t/c/sec10-2.html
配列とポインタ
こことかいいんじゃないか?
0081デフォルトの名無しさん
2006/10/21(土) 15:50:16>>80 ありがとうございます。修行します。
0082デフォルトの名無しさん
2006/10/21(土) 15:55:00>int arr[5];のとき、arrと&arrの区別が付きません。中身は両方とも
>arrの先頭アドレスかと思います。
機械の観点から見れば同じ値だけど、C言語から見ると型が違うので解釈も違う。
例えば、arr + 1はarrの第二要素を指すポインタだけど、
&arr + 1は違うところ(具体的には、arrをint [5]の配列(つまり配列の配列)の一要素とみなして
その次の要素)を指す。
>arr=&(arr[0])で配列の先頭要素へのポインタであり、&arrはarrそのもの
>へのポインタということですか?
その通り。w
0083デフォルトの名無しさん
2006/10/21(土) 16:53:18#include <stdio.h>
int main(void){
int arr[]={11,21,31,41,51};
printf("arr: %d\n", arr);
printf("arr+1: %d\n", arr+1);
printf("&arr+1: %d\n", (&arr)+1);
int (*parr)[5] = &arr;
printf("parr+1: %d\n", parr+1);
printf("parr++: %d\n", ++parr);
int * ptr=arr;
printf("++arr: %d\n", ++arr);
printf("++ptr: %d\n", ++ptr);
}
で、結果が
arr: 4278992
arr+1: 4278996
&arr+1: 4278996
parr+1: 4278996
parr++: 4278996
++arr: 0
++ptr: 4278996
&arr+1はarr+(5 * 4byte)先ということではないのですね?
あと、最後の3行から、arrは配列arrの先頭要素のアドレスを返すけれど、
ポインタでは無いと考えていいでしょうか?(処理系はcintです。)
#うざく感じているみなさん、大変申し訳ありません。
#もう少しなので、多めに見てくださいますよう、お願いします。
0084デフォルトの名無しさん
2006/10/21(土) 17:01:44それはたぶん処理系がおかしい。
gcc-4.1.1では、
test.c: In function ‘main’:
test.c:11: error: インクリメントの中での左辺値が無効です
と言われる。この部分をコメントアウトしてコンパイル・実行すると、
arr: -1080531448
arr+1: -1080531444
&arr+1: -1080531428
parr+1: -1080531428
parr++: -1080531428
++ptr: -1080531444
こうなって、&arr+1はarrより20バイト先を指していることが分かる。w
0085デフォルトの名無しさん
2006/10/21(土) 17:16:40どうも腑に落ちないと思ったら、処理系の問題とは。
cintがそんな不細工とは思えないので、設定ミスかな?
ちゃんとしたコンパイラで勉強するようにします。
> インクリメントの中での左辺値が無効です
++arrはNGということですね(arrのポインタならOK)?
ありがとうございました。
0086デフォルトの名無しさん
2006/10/21(土) 17:56:03[2] 問題文
1次元離散座標ランダムウォークで, 遷移確率が
1/4(y=x-1),
w(y|x)=3/4(y=x+1),
0(それ以外)
というものを考える.
x=0から出発して3ステップ歩いた後のウォーカーの
位置を X(3) と書こう. X(3)の平均と分散を計算しよう,.
[3] 環境
[3.1] OS: Windows XP
[3.2] コンパイラ名とバージョン: Visual Studio.NET2003
[3.3] 言語: C
[4] 期限: 2006年10月24日09:00まで
[5] その他
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2686.txt
を利用して作ってください
008786
2006/10/21(土) 17:56:45到達地点の座標 X(3) のサンプル平均 m とサンプル分散 s2 を計算するプログラムを作ろう.
つまり,
サンプルの個数?
10
ランダムウォークの長さ?
3
シード?
3098
とすると, とすると, 3098 を seed として, 長さ 3 のランダムウォークを10回行い,
# サンプル番号 到達地点の座標
0 3
1 -1
2 -1
3 1
4 1
5 -3
6 1
7 -3
8 3
9 -1
サンプルの個数 10
サンプル平均 1.400000
サンプル分散 8.711111
と出力するようなプログラムを作ろう. (上のサンプル平均とサンプル分散の値は正しくありません。)
0088デフォルトの名無しさん
2006/10/21(土) 17:59:41yってなに?
1/4の確率でx座標が-1、3/4で+1ってこと?
0089デフォルトの名無しさん
2006/10/21(土) 18:37:15[2] 問題文:
整数型intは32ビットの内部表現をもつ。どの範囲の整数まで表現できるか
調べなさい。
その上で、範囲外の結果となる演算をしたときにどのような値が出力されるのか。
そしてなぜ、そのような値が出力されるのか、
コンピュータの計算原理をふまえて説明しなさい。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:VC++ 6.0
[3.3] 言語:C++
[4] 期限:2006年10月23日まで
[5] その他の制限: なし
コンピュータの計算原理というのがよくわからなくて…
お願いします。
009089
2006/10/21(土) 18:44:48[1] 授業単元:プログラム
[2] 問題文:
整数型intの値を、どの段階で実数型doubleに型変換すべきか検討しなさい。
2つ以上の場合で実際にプログラムを作成し、計算結果が同じとなるデータ、
異なるデータを示しなさい。
計算結果が異なる場合、なぜそうなるのか、コンピュータの計算原理、
コンピュータの計算原理をふまえて説明しなさい。
#include<stdio.h>
int main(void) {
int x, y, z;
printf("xを入力して下さい。: ");
scanf("%d", &x);
printf("yを入力して下さい。: ");
scanf("%d", &y);
printf("zを入力して下さい。: ");
scanf("%d", &z);
printf("[x+y+z] heikin = %f\n", (double)( x + y + z ) / 3);
return(0);
}
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:VC++ 6.0
[3.3] 言語:C++
[4] 期限:2006年10月23日まで
[5] その他の制限: なし
0091デフォルトの名無しさん
2006/10/21(土) 19:10:33学校がくれるのか?
教えて学生さん><
0092デフォルトの名無しさん
2006/10/21(土) 19:16:280093デフォルトの名無しさん
2006/10/21(土) 19:17:43それは知ってる
俺もアカデミックですから
Amazonは年齢認証なしに買わせてくれたし・・・
でも6.0って今売ってるの?
0094デフォルトの名無しさん
2006/10/21(土) 19:48:14あとはVC++6.0ってアクティベーションないんじゃないかな、古いし
0095デフォルトの名無しさん
2006/10/21(土) 19:57:310096デフォルトの名無しさん
2006/10/21(土) 21:24:54#include<stdio.h>
int main(void)
{
int a, i;
a=0x7FFFFFFE;
for(i=0;i<3;i++)
printf("%d\n", a++);
printf("\n");
a=0x80000001;
for(i=0;i<3;i++)
printf("%d\n", a--);
printf("\n");
return 0;
}
0097デフォルトの名無しさん
2006/10/21(土) 21:29:48試しに x=1 y=2 z=4 でもいれてみてください
#include<stdio.h>
int main(void) {
int x, y, z;
printf("xを入力して下さい。: ");
scanf("%d", &x);
printf("yを入力して下さい。: ");
scanf("%d", &y);
printf("zを入力して下さい。: ");
scanf("%d", &z);
printf("[x+y+z] heikin = %f\n", (double)( x + y + z ) / 3);
printf("[x+y+z] heikin = %f\n", ( x + y + z ) / (double)3);
printf("[x+y+z] heikin = %f\n", (double)(( x + y + z ) / 3));
return(0);
}
0098デフォルトの名無しさん
2006/10/21(土) 21:58:15http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2802.c
一応やってみたけど、根本的にやり直したほうが…
0099デフォルトの名無しさん
2006/10/21(土) 22:02:110100デフォルトの名無しさん
2006/10/21(土) 22:47:37[2] 問題文(含コード&リンク): キーボードから月(12ヶ月)に相当する整数値を入力し,その月の値に応じて,例のように表示するプログラムを作成せよ.ただし,switch~case文を使い,できる限り少ない個数のcase文で記述するよう工夫すること.
(実行例)
何月? => 3
1st month of spring
何月? => 4
2nd month of spring
何月? => 5
3rd month of spring
何月? =>6
1st month of summer
何月 => 13
そんな月ない!
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: VisualStudio.net2003
[3.3] 言語: C
[4] 期限: 10月25日
[5] その他の制限: お願いします
0101デフォルトの名無しさん
2006/10/21(土) 22:52:09角度 sin cos
0 0.00 1.00
…
180 1.00 0.00
[2] 問題文:↑みたいな感じに正弦、余弦の値を求める物です。
で、開始値、終了値、間隔は都度入力、単位はdegree、度数法です。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ:Borland C
[3.3] 言語:C (printf, scanf, if-else, swich, do-while, forと算術処理関連まで来てます。)
[4] 期限:基本無制限
[5] そのほか:特には
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2803.txt
なんかしっくり来ないです…
0102デフォルトの名無しさん
2006/10/21(土) 22:58:18何そのcase0個の方が手っ取り早い問題(;´Д`)
0103デフォルトの名無しさん
2006/10/21(土) 22:58:34そのソースコードは何?
「しっくりこない」って何?
0104デフォルトの名無しさん
2006/10/21(土) 23:07:30http://pc8.2ch.net/test/read.cgi/tech/1158844912/684
0105デフォルトの名無しさん
2006/10/21(土) 23:08:01スルーしろ
0106ワンダフル魁 ◆F9pJmydzS.
2006/10/21(土) 23:14:13#include<stdio.h>
int main(void)
{
int ch;
printf("10進数を入力してください。\nCtrl+Zで処理を終了します。\n");
scanf("%d",&ch);
0107ワンダフル魁 ◆F9pJmydzS.
2006/10/21(土) 23:15:19switch(ch){
case 1:
printf("apple\n");
scanf("%d",&ch);
break;
case 2:
printf("banana\n");
scanf("%d",&ch);
break;
case 3:
printf("cherry\n");
scanf("%d",&ch);
break;
default:
printf("???\n");
scanf("%d",&ch);
break;
}
}
return 0;
}
0108デフォルトの名無しさん
2006/10/21(土) 23:17:05printf("10進数を入力してください。\nCtrl+Zで処理を終了します。\n");
scanf("%d",&ch); ←ここ
0109デフォルトの名無しさん
2006/10/21(土) 23:19:22printf("10進数を入力してください。\nCtrl+Zで処理を終了します。\n");
↓
printf("10進数を入力してください。\n-1で処理を終了します。\n");
0111ワンダフル魁 ◆F9pJmydzS.
2006/10/21(土) 23:31:47#include<stdio.h>
int main(void)
{
char word1[32],word2[32];
printf("同じ長さの文字列を二つ入力しなさい。\n");
gets(word1);
gets(word2);
while(word1!=word2){
printf("異なる文字列を入力しました");
scanf("%c",&word1);
0112デフォルトの名無しさん
2006/10/21(土) 23:32:260113ワンダフル魁 ◆F9pJmydzS.
2006/10/21(土) 23:36:02scanf("%c",&word2);
}
printf("等しい文字列を入力しました。");
return 0;
}
0114デフォルトの名無しさん
2006/10/21(土) 23:41:220115デフォルトの名無しさん
2006/10/21(土) 23:45:03これだろ?スルーできなかったww
0116デフォルトの名無しさん
2006/10/21(土) 23:49:12printf("異なる文字列を入力しました");
↓
printf("異なるアドレスです\n");
0117デフォルトの名無しさん
2006/10/21(土) 23:50:380118デフォルトの名無しさん
2006/10/21(土) 23:53:030119デフォルトの名無しさん
2006/10/21(土) 23:53:52彼女は言った。
「ここにあるよ」
確かに、彼女はそう言った。
永遠のある場所。
…そこにいま、>>113は立っていた。
0120116
2006/10/21(土) 23:54:07期待している状態が分からない以上適当に答えるか質問するかスルーしかない。
こんなときオレは全力で答える。(分かる範囲なら)
0121デフォルトの名無しさん
2006/10/21(土) 23:55:53エスパーでがんがれ!
・・・俺はやらん。
0122デフォルトの名無しさん
2006/10/22(日) 00:00:240123デフォルトの名無しさん
2006/10/22(日) 00:17:09#include<stdio.h>
#include<string.h>
#defineBUF_SIZE(1024)
int main(void)
{
char word1[BUF_SIZE],word2[BUF_SIZE];
while(1){
printf("同じ長さの文字列を二つ入力しなさい。\n");
gets(word1);
gets(word2);
if(strcmp(word1, word2)==0)
break;
printf("異なる文字列を入力しました\n");
}
printf("等しい文字列を入力しました。\n");
return 0;
}
0124デフォルトの名無しさん
2006/10/22(日) 00:28:45初心者向けのわかりやすいやつを教えてください
0125デフォルトの名無しさん
2006/10/22(日) 00:31:27スレ違いだ
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/
012656
2006/10/22(日) 00:35:18ありがとうございました
0127デフォルトの名無しさん
2006/10/22(日) 01:31:05[2] 問題文(含コード&リンク):
文字列strを逆順に格納する関数(recを受け取ったらcerを表示する)
void rev_string(char str[]){ /*…*/ }
を作成せよ。
[3.1]OS:Windows XP
[3.2]コンパイラ:gccバージョン不明
[3.3]言語:C言語
[4]期限:2006/10/24 9:00まで
[5]その他制限事項:ポインタ使用不可
お願いします
0128デフォルトの名無しさん
2006/10/22(日) 01:47:50バッファオーバーフローの脆弱性があります
void rev_string(char str[]){
char str2[1000];
int i,len;
len = strlen(str);
strcpy(str2, str);
for(i = 0; i < len; i++)
str[i] = str2[len - 1 - i];
}
0129デフォルトの名無しさん
2006/10/22(日) 01:55:15[2] 問題文(含コード&リンク):nyuryoku.datというファイルを作り、そのファイルに
格納されている文字列を行列形式で表示させよ。
↓以下nyuryoku.datの中身
4 8
1 3 5 7 9 0 2 4
6 8 1 3 5 7 9 0
2 4 6 8 1 3 5 7
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン: Borland C(V5.5)
[3.3] 言語: C言語
[4] 期限: 10月23日18:00まで
[5] その他の制限:標準ライブラリのみ使用
どうしてもできません…よろしくお願いします><
0130デフォルトの名無しさん
2006/10/22(日) 01:55:530131デフォルトの名無しさん
2006/10/22(日) 02:14:04stdio.hとかの中でもポインタ使ってるだろうから・・・
0132デフォルトの名無しさん
2006/10/22(日) 02:52:59行列形式って何?
0133デフォルトの名無しさん
2006/10/22(日) 03:07:21多分4行8列の行列に読み込んで画面に[ ]のような記号を外に付けて表示しろって
事だと思うけど、データが3行分しかないよ?
0135デフォルトの名無しさん
2006/10/22(日) 05:08:32nyuryoku.datというファイルを作り、そのファイルに格納されている文字列を行列形式で表示させるプログラム。
転置行列は省いてしまったが。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define FILENAME "nyuryoku.dat"
int main(void){int i,j,k,c,m,count=0,size=256,tcount=0;int*buf,*row,*column;
int nyuryoku[4][8]={{4,8,},{1,3,5,7,9,0,2,4,},{6,8,1,3,5,7,9,0,},{2,4,6,8,1,3,5,7,}};
FILE *fp;if((fp=fopen(FILENAME,"wt"))==NULL){fprintf(stderr,"error : can't open file");exit(1);}
for(i=0;i<4;i++){if(i==0){fprintf(fp,"%d %d",nyuryoku[0][0],nyuryoku[0][1]);}else{fprintf(fp,"%d",nyuryoku[i][0]);
for(j=1;j<8;j++)fprintf(fp," %d",nyuryoku[i][j]);}fprintf(fp,"\n");}fclose(fp);
if((fp=fopen(FILENAME,"rt"))==NULL){fprintf(stderr,"error : can't open file");exit(1);}
buf=(int*)malloc(sizeof(int)*size);while(fscanf(fp,"%d",&buf[count])!=EOF)if(++count>=size){size*=2;buf=(int*)realloc(buf,sizeof(int)*size);}fclose(fp);
m=sqrt(count);row=malloc(sizeof(int)*m);column=malloc(sizeof(int)*m);for(i=1;i<=m;i++)if(count%i==0){row[tcount]=i;column[tcount]=count/i;tcount++;}
for(i=0;i<tcount;i++){for(j=0;j<row[i];j++){printf("%d",buf[j*row[i]]);for(k=0;k<column[i];k++)
printf(" %d",buf[j*row[i]+k]);printf("\n");}printf("\n");}free(buf);free(row);free(column);return 0;}
0137135
2006/10/22(日) 09:40:320138135
2006/10/22(日) 09:52:46最後から3行目m=sqrt(count)をm=countに
最後から2行目j*row[i]をj*column[i]に
最後の行j*row[i]をj*column[i]に
すればなんとかいけるかな
0139デフォルトの名無しさん
2006/10/22(日) 10:10:02さらに言うと(pop関数に戻り値が書かれているので)、構造体を
戻り値にするのは不可能ですよね?
文法書を読んでも書かれていないので混乱しています。
これが解らないと宿題にとりかかれないので教えてください。
0140デフォルトの名無しさん
2006/10/22(日) 10:14:41>>1
0141デフォルトの名無しさん
2006/10/22(日) 10:27:30> 文法書を読んでも書かれていないので混乱しています。
規格には書かれている。
文法書ってなんや?
0142デフォルトの名無しさん
2006/10/22(日) 10:27:33問題以前の話だけど、ここで聞くのが適切かと思ったんだよ
0143デフォルトの名無しさん
2006/10/22(日) 10:28:41C言語の参考書のことです
0144デフォルトの名無しさん
2006/10/22(日) 10:34:43言語が違うんじゃ?
Perlじゃない?
0145デフォルトの名無しさん
2006/10/22(日) 10:36:22http://www.google.com/search?num=50&lr=lang_ja&q=%E6%A7%8B%E9%80%A0%E4%BD%93%20%E6%88%BB%E3%82%8A%E5%80%A4
0146デフォルトの名無しさん
2006/10/22(日) 10:42:30できますよ。
std::stack<std::pair<int,int> >
0147デフォルトの名無しさん
2006/10/22(日) 10:57:55> スタックの内容の型
初耳の表現
型有/無に関わらず、”スタック”は抽象構造だぞ?
それともC++にはスタック型という唯一の型があったのか?
0148デフォルトの名無しさん
2006/10/22(日) 11:18:54?
見当違いの予感。
唯一の型じゃないからそこに入れられるものの型について質問してんじゃないの?
0149147
2006/10/22(日) 12:26:03うーん、そこまで考えてもいいのかな?
”スタック”が何を指してるのか分からない限り話が進まないよね
もしかしたら>>139はwindowsのtlsの話してるかもしれないし、
stlのstack<T>かもしれないし、自前のstackかもしれないし。
さすがにリアルワールドの積荷の話じゃないだろうけど
0150139
2006/10/22(日) 12:41:19struct division {
int x;
int y;
};
typedef struct division elementtype;
struct stack {
int top;
elementtype elements[STACKSIZE];
};
elementtype pop(struct stack *s) {
if (s->top < 0) {
printf("stack underflow"); exit(1); }
else return s->elements[s->top--];
}
メイン関数でpushはうまくできたのですが、popをするとエラーが発生してしまい、
原因がさっぱりだったため、血迷って愚かな質問をしてしまい申し訳ありません。
popの戻り値がおかしかった(メンバx,y共になぜかtop-1の値が入っている)ので、
[s->top--]のところの--を取ってみたらメンバの値が正常に入力されていました。
そこで、まさかと思いLinuxでコンパイルしてみたらできました・・・。
これでやっと宿題が始められます。お騒がせいたしました。
>148
その通りです
0151デフォルトの名無しさん
2006/10/22(日) 12:52:14良ければソース見せてもらえない?
■ このスレッドは過去ログ倉庫に格納されています