C言語なら俺に聞け(入門篇) Part 17 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
07/07/24 23:17:11
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 16
スレリンク(tech板)

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 93代目
スレリンク(tech板)

2:1
07/07/24 23:18:31
過去スレ

Part 1 スレリンク(tech板)
Part 2 スレリンク(tech板)
Part 3 スレリンク(tech板)
Part 4 スレリンク(tech板)
Part 5 スレリンク(tech板)
Part 6 スレリンク(tech板)
Part 7 スレリンク(tech板)
Part 8 スレリンク(tech板)
Part 9 スレリンク(tech板)
Part 10 スレリンク(tech板)
Part 11 スレリンク(tech板)
Part 12 スレリンク(tech板)
Part 13 スレリンク(tech板)
Part 14 スレリンク(tech板)
Part 15 スレリンク(tech板)

3:デフォルトの名無しさん
07/07/25 00:01:02
>>1

4:デフォルトの名無しさん
07/07/25 00:55:38
プッツ

5:デフォルトの名無しさん
07/07/25 01:13:26
C++のことを聞きたいのだったらここへ行きなさい。
【初心者歓迎】C/C++室 Ver.40【環境依存OK】
スレリンク(tech板)l50

6:デフォルトの名無しさん
07/07/25 04:20:59
大昔にBASICって言語があって、
GOTOがはびこっていたので、GOTOを
なくそうとしてPASCALがうまれて、
でもPASCALでもまだ少しGOTOが残っていたので
Cで完全にGOTOをなくせたけど、まだ
再帰とポインタが残っていたので
JAVAで再帰とポインタを駆逐した、って
あってる?

7:デフォルトの名無しさん
07/07/25 05:04:59
大間違い。

8:デフォルトの名無しさん
07/07/25 05:54:57
つうか合ってる箇所が一つも無いな

9:デフォルトの名無しさん
07/07/25 08:06:43
再帰を駆逐してどうする

10:デフォルトの名無しさん
07/07/25 10:10:45
printfみたいにいくつ引数があるかわからない関数を作るにはどうしたらいいのでしょうか?

11:デフォルトの名無しさん
07/07/25 10:42:00
>>10
環境によって大きく2通りあるけど、一つは
stdarg.h をincludeして、可変引数の部分を ... にして
va_start、va_arg、va_end を使う。
これらの単語を適当にググレばサンプルあると思う。

12:デフォルトの名無しさん
07/07/25 10:46:22
>>11
ありがとう
そこらへんぐぐってがんばってみます

13:デフォルトの名無しさん
07/07/25 20:53:51
今日は静かだな

14:匿名
07/07/25 23:23:37
C言語のプログラミングについておしえてほしいんですけど誰か教えてくれませんか?


15:デフォルトの名無しさん
07/07/25 23:27:26
これはひどい釣り

16:デフォルトの名無しさん
07/07/25 23:28:54
>>14
なにか分からないことがあったら、そのとき質問してみな。

17:匿名
07/07/26 00:19:46
6ヶ月分のガス料金を求めます。
使用料金=基本料金+(1㎥当たりの単価×使用量)
使用量      基本料金   1㎥当たりの単価
25㎥以下      690円     127円
25から500㎥以下  1170円     108円
500㎥より多い   6980円     96円

月の使用量を順番にキーボードから入力する。
使用料金は基本料金+(1㎥当たりの単価×使用量)計算する。
各月の使用料金は算出して以下のように表示させる。
      1gatu 2gatu 3gatu 4gatu 5gatu 6gatu Goukei Heikinn
charge 12500 25600 35410 19860 13250 29800 1278540 21906

if文と繰り返し(for.while.do〜whileのいずれか)、2次元配列を利用してプログラムを作成する。

以上なんですけどお願いできませんか?


18:デフォルトの名無しさん
07/07/26 00:21:34
>>17
宿題池

19:匿名
07/07/26 00:23:21
自分ができないから他に聞けってことか
ただのさらしじゃん


20:デフォルトの名無しさん
07/07/26 00:25:08
>>19
宿題池

21:デフォルトの名無しさん
07/07/26 00:33:16
宿題池ってなんですか?

22:デフォルトの名無しさん
07/07/26 00:35:13
7月の宿題にしちゃ簡単だな。高校生くらいか?
宿題スレでテンプレに沿って書けば簡単だからいっぱい答えてもらえると思うよ

23:デフォルトの名無しさん
07/07/26 01:04:29
とりあえず>>1ぐらい見ろよ…

24:デフォルトの名無しさん
07/07/26 06:41:21
>>17
ちょっと前に全く同じ質問があって、回答もされてた。
残念だったな。

25:デフォルトの名無しさん
07/07/26 09:07:36
>>17
ほれ。
s,v[7];main(i,n){for(;n=i<7;s+=v[i++]=n<26?690+n*127:n<501?1170+n*108:6980+96*n)scanf("%d",&n);
for(++i;n<6;i=1)printf("%*dgatu ",i,++n);printf("Goukei Heikinn\ncharge");for(;i<7;printf(" %5d",v[i++]));printf(" %6d %d\n",s,s/6);}

26:デフォルトの名無しさん
07/07/26 17:01:57
char型で渡されてきた数式を逆ポーランド記法に変換して文字列として出力したいのですが、
この手のソースやライブラリがあれば教えてください。
よろしくお願いします。

27:デフォルトの名無しさん
07/07/26 17:02:27
ツリーでやれ

28:デフォルトの名無しさん
07/07/26 17:18:26
#include <stdio.h>

int main()
{
float x =0.0;

while(x != 1.0){
x+=0.1;
}
return 0;
}
これが無限ループになるのはなぜですか?
教えてください。

29:デフォルトの名無しさん
07/07/26 17:22:12
0.1は二進法で正確に表現できない。
だから10回足しても誤差が入って1.0ちょうどにならない。

30:デフォルトの名無しさん
07/07/26 17:25:54
while(x != 1.0){
x+=0.1;
printf("%.15g\n", x);
}
としてみると判るかと思います。

31:デフォルトの名無しさん
07/07/26 17:32:25
>>29 30
0.100000001490116
など出て無限ループになった意味がよくわかりました。
ありがとうございます。

32:デフォルトの名無しさん
07/07/26 18:02:05
#include<stdio.h>

int tasu(int b[]){
int y,i;

for(i = 0; i <= 4; i++){
y += b[i];
}
return y;
}

main()
{
int a[]={1,2,3,4,5};
int x;

x = tasu(a);
printf("%d",x);
}

15と表示させたいんですが変な値が出てしまいます。
どこがおかしいんでしょうか?

33:デフォルトの名無しさん
07/07/26 18:04:02
>>32
tasu()関数のy の初期化

34:デフォルトの名無しさん
07/07/26 18:06:30
ありがとうございます。
基本的な間違いでした。反省します。

35:デフォルトの名無しさん
07/07/26 18:19:42
*(cp+1) = *cp;
cp++;
という操作を一息でやりたいのですが、
*(++cp) = *cp; や、*(cp++) = *cp; ではうまくいきませんでした。
なぜダメなのかを教えてほしいです。
また一息でやるすべはないのでしょうか?よろしくお願いします。

36:デフォルトの名無しさん
07/07/26 18:26:21
>>35
一つの式の中で代入系の動作を複数含むと、いつその動作をすればいいか確定できない。
従って、一つの式で全てを賄うのは無理。

37:デフォルトの名無しさん
07/07/26 18:53:39
早期回答ありがとうございます。
実はポインタの勉強でこういうプログラムを書きました。
#include<stdio.h>
#define N 10
main(){
char c[N]={100};
int i[N]={100};
int j;
char *cp =c;
int *ip =i;

for(j=0;j<N;j++){
*(cp+1) = *cp;
cp++;
*(ip+A) = *ip;
ip++;
}
for(j=0;j<N;j++){
printf("%c %d\n",c[j],i[j]);
}
}

38:デフォルトの名無しさん
07/07/26 18:54:53
A=1とすると正常に動作しますが
A=4とすると正常に動作しません。
私はA=4だと思うのですが、なぜA=1で正常に動作するのでしょうか?
よろしくお願いします。

39:デフォルトの名無しさん
07/07/26 18:58:57
>>38
ポインタには型がある。
ポインタの足し算で、1足すというのはアドレスを sizeof (型) * 1足すということなんだよ。

40:デフォルトの名無しさん
07/07/26 19:01:48
早期回答ありがとうございます。
そんな便利機能があったとは知りませんでした。
でも前に意図的に4足したような記憶があります。
そういうケースってありますか?

41:デフォルトの名無しさん
07/07/26 19:03:07
char* にキャストしてたら4足さなきゃならんだろうな

42:デフォルトの名無しさん
07/07/26 19:06:48
なんとなくわかったような気がします。
何度もありがとうございました。

43:デフォルトの名無しさん
07/07/26 19:31:08
>>26
URLリンク(www.google.co.jp)

44:すこふぃーるど
07/07/26 20:25:55
明日プログラミング(C言語)のテストです。過去問を見て、どこ探してもわからないんで質問させてもらいます。
Q1 7500個の実数を読み込み、その一番初めのデータが2*3、14159より大きかったら
そのままの順で、そうでなかったら全てを逆順で出力せよ。

Q2 4つの実数(x1、x2、x3、x4)を読み込み、そのうち2つずつの和
(x1+x2、x1+x3、x1+x4、x2+x3、....)のうち最も小さな数値
を出力する。

45:デフォルトの名無しさん
07/07/26 20:33:19
>その一番初めのデータが2*3、14159より大きかったら
これはどういう意味?

46:デフォルトの名無しさん
07/07/26 20:48:25
>>44
Q2だけ

#include <stdio>
int main(void)
{
char buf[100];
int x[4],i,k,min=0x7fffffff;
printf("入力>");
fgets(buf,100,stdin);
if(sscanf(buf,"%d %d %d %d",&x[0],&x[1],&x[2],&x[3])!=4)
{
printf("エラー\n");
return 0;
}
for(i=0;i<3;i++) for(k=i+1;k<4;k++) if(x[i]+x[k]<min) min=x[i]+x[k];
printf("最小値=%d",min);
return 0;
}

47:デフォルトの名無しさん
07/07/26 21:01:40
>>45
2*PIってことでしょう(たぶん)

48:デフォルトの名無しさん
07/07/26 21:04:51
>>47
天才
自分まじで気づかんかったわ

49:デフォルトの名無しさん
07/07/26 21:24:50
>>47
エスパー乙
やっぱ資質ある者って一般人とは違うな。普通気づかない。

50:デフォルトの名無しさん
07/07/26 22:59:17
逆に、なんでみんなが判らないのか判らなかった漏れもいる。
なるほど、読点と思っちゃったわけか。

51:デフォルトの名無しさん
07/07/26 23:03:48
うん
騙し絵で一つの見え方にはまってた感じ

52:デフォルトの名無しさん
07/07/27 00:17:54
>>44
Q1
#include<stdio.h>
#define Bsize 80
#define Dsize 7500
main(){
char buf[Bsize];
int i;
double data[Dsize];

for(i=0;i<Dsize;i++){
fgets(buf,Bsize,stdin);
sscanf(buf,"%lf",&data[i]);
}
if(data[0] > 2*3.14159){
for(i=0;i<Dsize;i++){
printf("%lf\n",data[i]);
}
}
else{
for(i=Dsize-1;i>=0;i--){
printf("%lf\n",data[i]);
}
}
}

53:デフォルトの名無しさん
07/07/27 02:22:42
001 C言語によるプログラムの一般的な作成手順を述べよ。
002 C言語のプログラムのソースファイルの拡張子は何か。
003 ソースファイルからオブジェクトファイルを作ることを何というか。
004 オブジェクトファイルから実行ファイルを作ることを何というか。
005 講義で使ったコンパイラの名前を答えよ。
006 UNIX(LINUX)では実行ファイルの名前はどのようになるか。
007 デバッグとは何か。
008 C言語でプログラムに使う文字はどういうものか。
009 C言語の標準規格はどう呼ばれるか。
010 もっとも短い実行できるC言語のソースを書け。
011 main関数とは何か。
012 main関数の型は何か。
013 main関数の戻り値はどうなるか。
014 グローバル(大域)変数とローカル(局所)変数の違いを答えよ。
015 静的変数はどういうときに使われるか。
016 変数の基本データ型をいくつか答えよ。
017 初期値が1である整数変数iの宣言は。
018 変数のアドレスとは何か。
019 変数のアドレスを知るにはどうするか。
020 講義で使ったシステムの整数の範囲を答えよ。
021 配列(変数)とは何か。
022 100個宣言した配列(変数)の添え字の範囲は。
023 配列(変数)の初期値はどのように設定するか。
024 2次元配列はどのように宣言するか。
025 2次元配列はどのように並んでいるか。
026 構造体とは何か。
027 typedefとstructの役割はどう違うか。
028 #includeとは何か。
029 #include <stdio.h>の<>の意味は。
030 ヘッダファイルとは何か。

54:デフォルトの名無しさん
07/07/27 02:24:25
031 ヘッダファイルの拡張子は何か。
032 コメントとは何か。
033 コメントをソースに記入するのにはどうするか。
034 代入i=1の式としての値は何になるか。
035 整数変数iを1増やすのにどういう方法があるか。
036 printf関数は何をする関数か。
037 printf関数のfの由来は。
038 printf関数で改行させたいときには何を使うか。
039 printf関数で文字配列sの文字列を表示させたいときにはどう書くか。
040 整数変数iの値が1のときprintf("%d",--i);printf("%d",i++);でどういう表示がされるか。
041 整数変数dにscanf関数で整数をキーボード入力させる文を書け。
042 文字配列にscanf関数でキーボード入力するとき気をつけるべきことは。
043 文字リテラル'A'の整数としての値は。
044 'c'-'C'の値はいくらになるか。
045 文字の種類を判別するときにインクルードするヘッダファイルの名前は。
046 文字列と'\0'の関係は。
047 strcmp関数を使うときにインクルードするヘッダファイルの名前は。
048 文字列の長さを知るために使う関数は。
049 1*2+3の値はいくらになるか。
050 10%(-3)の値はいくらになるか。
051 ビット演算子の例をあげよ。
052 27&15の値はいくらになるか。
053 27|15の値はいくらになるか。
054 31>>2の値はいくらになるか。
055 int i,j;と宣言されているとき、&i-&jの絶対値はいくらか。
056 整数変数aの値が12から19までのときだけ「TEEN」の4文字を表示する文を書け。
057 (i>=0)?i:(-i)は何をする式か。
058 NULLとは何か。
059 for(i=0;i<10;i++)printf("!");という文では感嘆符は何回表示されるか。
060 for(i=10;i>-10;--i)if(i)printf("o");ではoは何文字表示されるか。

55:デフォルトの名無しさん
07/07/27 02:24:55
061 i=10;while(i){printf("+");--i;}では+は何文字表示されるか。
062 breakはfor,do,whileではどのような意味があるか。
063 continueはfor,do,whileではどのような意味があるか。
064 switch文ではcaseの最後にbreak文が必要なのはなぜか。
065 switch文でdefault:はどういう意味を持つか。
066 if(i==0){}else{printf("A");}を出来るだけ簡単に書き直せ。
067 関数のプロトタイプ宣言はなぜ必要か。
068 関数の値を返すのに使う予約語は。
069 ファイルを扱うときにインクルードするヘッダファイルの名前は。
070 ファイルを扱うときに使う構造体の型の名前は。
071 fopen関数の戻り値は何か。
072 fopen関数が実行に失敗するとどうなるか。
073 fprintf関数とprintf関数の引数の違いは。
074 fscanf関数で1行読み込むときの注意は。
075 getc関数はどのような引数と戻り値を持つ関数か。
076 EOFとは何か。
077 cが整数変数、fpが正しい状態でwhile(EOF!=(c=getc(fp)))printf("%c",c);を実行すると結果は。
078 fflush関数は何をする関数か。
079 fclose関数が実行に失敗するとどうなるか。
080 標準入力とは何か。
081 標準出力とは何か。
082 ファイル入出力でどのようなエラーが考えられるか。
083 マルチタスク環境でファイルをロックするとはどういうことか。
084 rand関数を扱うときにインクルードするヘッダファイルの名前は。
085 rand関数の返す整数の値はどのような名前で呼ばれるか。
086 擬似乱数のシードとは何か。
087 srand関数はrand関数とどのような関係にあるか。
088 32ビットのint型は10進数で何桁の精度になるか。
089 float型は十進数でほぼ何桁の精度になるか。
090 double型は十進数でほぼ何桁の精度になるか。

56:デフォルトの名無しさん
07/07/27 02:25:48
091 プログラムの処理の手順を一般に何と呼ぶか。
092 自分自身を呼び出すプログラムの手法を何というか。
093 キュー(待ち行列)とはどのようなものか。
094 スタックとはどのようなものか。
095 オーバーフローとは何か
096 アンダーフローとは何か。
097 いわゆるセグメンテーションフォルトで中断した後にできるファイルを一般に何というか。
098 C言語を作ったのは誰か。
099 C言語の祖先に当たるプログラム言語は。
100 C言語はどういう種類のプログラム言語か。

57:デフォルトの名無しさん
07/07/27 02:43:28
>>53
C言語プログラマへの100の質問?
そういうのは個人サイトでやってくれ。

58:デフォルトの名無しさん
07/07/27 03:01:16
イチローのやつかと思った

59:デフォルトの名無しさん
07/07/27 07:34:53
>>56
097
今時一々ファイルを作る設定にしている香具師はいませんが。

60:デフォルトの名無しさん
07/07/27 07:46:09
Cygwin とかデフォでコアダンプされた気が

61:デフォルトの名無しさん
07/07/27 09:03:22
テスト中はコアダンプがけっこべんり

62:デフォルトの名無しさん
07/07/27 09:33:49
コアダンプ見ても意味わかんねーよバーヤバーヤ
という俺はgdb派。

63:デフォルトの名無しさん
07/07/27 09:42:05
gdbでもcoreつかえるべ?

64:すこふぃーるど
07/07/27 11:13:00
プログラミング(C言語)の事で質問があります。過去問を見て、どこ探してもわからないんで質問させてもらいます。
昨日の質問と合わせると結局全部になっちゃいますけど、質問させてもらいます。

Q3 平面上の10個のてんの座標がある。このうち原点から最も遠い点まで
の距離を求めよ。データは1行に座標x、yの2つの数値が並んでいるとする。

Q4 3つの数を読み込んでこれらを3辺とする三角形が存在するっかどうか
判断せよ。

Q5 直線上を運動するある物体の速度(m/s)を10秒置きに測定した一連の
データがある。測定データの総数は1番初めのデータで与えるとする。
10秒間の速度の平均変化率が最も大きかったときの時刻(測定開始後何秒から何秒
の間か)
とその数値を求めよ。

Q6 直線上を運動するある物体の速度(m/s)を10秒置きに測定した一連のデータ
がある。
測定データの総数は1番初めのデータで与えるとする。
移動距離を求めるため、このデータを数値積分せよ。
概算でよいので、速度を平均速度とみなし、測定間隔と速度の積を足し合わせる
だけでよい。

Q7. 3つの0でない実数(x、y、z)を読み込み、そのうち2つずつの比(x/y、
x/z、y/z、....)
の全ての組合せの値を出力する

65:デフォルトの名無しさん
07/07/27 11:21:12
宿題は宿題スレへ。ネタ回答希望なら止めないが。

66:デフォルトの名無しさん
07/07/27 11:23:29
素朴な疑問だが、xとyの比はx / yではないと思うしyとxの比に等しいと思うのだがx / yとy / xの両方必要なのだろうか。

67:デフォルトの名無しさん
07/07/27 13:20:55
xとyの比はx/yで、yとxの比はy/xだろ普通。

68:デフォルトの名無しさん
07/07/27 13:52:22
aとbみたいな表現だとa,bが対等な関係になっちゃって
a/bかb/aかなんて代入順序に依存する式を表す事なんてできるわけがない

69:デフォルトの名無しさん
07/07/27 13:57:13
うん

70:デフォルトの名無しさん
07/07/27 15:02:13
-foo.c-
static void foo(){
}
void *fp() = foo;

-main.c-
extern void *fp();

main(){
 (*fp)();  // ←これは呼べる
 foo();   // ←これは呼べない
}

この理解で合っていますか?

71:デフォルトの名無しさん
07/07/27 15:13:56
>>70
そのままだとコンパイルさえできない。
fpの定義がvoid (* fp)() = fooで、
宣言がextern void (* fp)()ならば、
コンパイルできるがリンクはできない。

72:70
07/07/27 15:26:22
分かりました。ありがとうございます

staticの関数を別ファイルから呼ぶことは
どうやっても出来ないってことですか?

73:デフォルトの名無しさん
07/07/27 15:34:42
>>72
だれが呼べないと書いた?
変数の定義と宣言を直せば呼べるぞ。

74:デフォルトの名無しさん
07/07/27 15:44:33
ちなみに、
(*fp)();

fp();
でも呼べる。

75:70
07/07/27 15:47:44
リンクできないってのがそうだと思って

-foo.c-
static void foo(){
}
void (*fp)() = foo;

-main.c-
#define FLAG 1
extern void (*fp)();

main(){
#if FLAG
 (*fp)();  // ←これは呼べる
#else
 foo();   // ←これは呼べない
#endif
}

FLAGが1なら普通に動作し
FLAGが0ならリンクエラーって事ですか?

76:デフォルトの名無しさん
07/07/27 15:47:52
要はこうしておけばいいのだ。
--foo.h--
extern void (* fp)(void);
--foo.c--
#include "foo.h"
static void foo(void) {printf("Whee!\n");}
void (* fp)(void) = foo;
--main.c--
#include "foo.h"
int main()
{
fp();
return 0;
}
--
本来staticな関数はあくまでも同一ファイル内限定公開なのだから、お勧めはしないが。
#コンパイラの最適化の妨げにもなるし。

77:デフォルトの名無しさん
07/07/27 15:49:33
>>75
>71はそういうことだね。fooと言う名前の関数エントリを探しても見つからないからリンクエラーになってしまう。
何故なら、fooはfoo.c内の静的リンケージしか持たないから名前自体が公開されないので。

78:70
07/07/27 15:57:12
ありがとうございました

ヘッダーで公開する関数を制御したかったのですが
ヘッダーになくてもグローバルだと呼べるから駄目と言われたので
なんかないかと思いまして

79:デフォルトの名無しさん
07/07/27 16:05:19
>>78
そういうことなら止めないけど、通常のstaticな関数と見分けがつくようにしておいた方がいいよ。
#関数にstaticがついてたら非公開だと思う人が圧倒的多数だから。

80:デフォルトの名無しさん
07/07/27 19:42:32
すみません。質問させていただきます。
文字を入力して回文か否かを判定するプログラムを制作したのですが、すべて「回文です」という判定が表示されてしまいます。

#include<stdio.h>
int kaibun(const char *ss)
{
char *s = "ss";
char *r = "ss";
while(*r)
*s++; *r--;
while(*s){
if(*s != *r)
return(1);
*s++;
*r--; }
return(0); }
int main(void){
char str[100];
printf("文字列を入力してください");
scanf("%s",str);
if(kaibun(str))
printf("%sは回文ではありません\n",str);
else
printf("%sは回文です\n",str);
return(0);
}

どこが変なのかさっぱりわかりません。ぜひお願いします。

81:デフォルトの名無しさん
07/07/27 20:06:40
>>80
多バイト文字では無いこと前提になるけど

char *s = "ss";
char *r = "ss";
ssという文字を見てるだけ
これはchar *ssのことじゃない

82:81
07/07/27 20:09:23
あとこの部分もおかしい
>while(*r)
>*s++; *r--;

これは
while(*r) {*s++;}
*r--; ←これはwhile()の外になる

と同じで*r が0以外である間*s++ を実行
無限ループになる

83:80
07/07/27 20:21:12
>>81,82
ありがとうございます。

char *ssを代入すればいいのでしょうか?

>while(*r)
>*s++; *r--;
のところは{}をつけたらいいのでしょうか?

すみません、始めたばかりで本当にセンスがなくて全くわかりません・・・。


84:81
07/07/27 20:35:59
>>83
>{}をつけたらいいのでしょうか?
それでもssの先頭アドレスから r--; していくからおかしなことになる

さっきも言ったけど多バイト文字だとうまく動かないからね
1バイト文字であること前提で

まず
char *s = "ss"; char *r = "ss"; を
char *s = ss; char *r = ss; にする
次に
while(*r) *s++; *r--; を
while(*r) r++; 
r--;
にする (この r--; は while() ループの外だからね
while(*r) r++; で*r は '\0'を指すことになるから、r--; で一つ前に戻しておく

while(*s){
if(*s != *r)
return(1);
*s++;
*r--; }
return(0); }
この部分はいいと思うよ

85:デフォルトの名無しさん
07/07/27 20:55:58
他人ですが、while(*s)とかやられると頭が?になってしまいます。

NULLで無い限り続けるって事ですよね?

86:81
07/07/27 20:57:58
>>85
while(*s!='\0') または while(*s!=0) ってことです
while(*s!=NULL) はちょっと・・・私からはなんとも言えません

87:80
07/07/27 20:58:27
>>84
こんなに丁寧に教えていただいてありがたいです。
訂正してコンパイラしてみたのですが、
char *s = ss; char *r = ss;
この部分がエラーがでて
「初期化により、ポインタの示す型からの修飾子が切り捨てられます」
と表示されてしまうのですがこれはどうしてなんでしょうか?


88:81
07/07/27 21:02:56
>>87
警告でなくて?

const char *s = ss; const char *r = ss; でしたね
頭に const を付けてください
もしくは引数の const をはずしてください

89:デフォルトの名無しさん
07/07/27 21:26:07
>>86
ポインタのポインタなら、while(*s!=NULL)だね。

90:89
07/07/27 21:27:17
ああ、上から話が続いてたのか。
読まずにカキコした。

91:81
07/07/27 21:39:59
>>90
いえいえ、気にしないでください

92:80
07/07/27 21:58:04
>>88
すみません。警告です。エラーと勘違いしました。

const!そうでした!!思い出しました。ありがとうございます!
しかし、ずっと学校の演習室で自習をやっていて今帰ってきたところなので実行できていません。すみません。

81さん、スレのみなさん色々ありがとうございました。

明日行って実行してきます。
全くといっていいほどCに対してセンスがないのでここの板のみなさんは本当にすごいと思います。
頭悪いのでペースは遅いと思いますが、
ポインタまでは自分のものにしたいのでまたちょくちょくここでお世話になるかもしれません。
そのときはまたよろしくお願いします。

93:81
07/07/27 22:05:55
>>92
今まで学校ですか
どの程度やっていたのか知りませんが、自分で>>80までやったのなら大丈夫だと思います
お疲れ様でした

94:80
07/07/27 22:13:46
>>93
いや、あれも参考書読んだり教授に聞いたりしながらグダグダな感じで作ったものです・・・
本当にCに嫌われているみたいで、わからないのが本当にくやしくて・・・
やっぱVBできたぐらいじゃCなんて到底無理なんだなって思いましたw

また最初から参考書読み直して基礎力つけてきます

95:デフォルトの名無しさん
07/07/27 22:38:33
1 2 3
4 5 6
7 8 9

こんなnum.datファイルがあったとして、これを3*3の配列に入れるためには
どうすればいいのですか?

{
int i,j;
int num[3][3];
FILE *fp;
fp = fopen("num.dat","r");

for( i = 0 ; i < 3; i ++ ){
for( j = 0 ; j < 3; j ++ ){
fscanf(fp, "%d",&num[i][j]);
}
}
fclose(fp);
}

教科書見ながらこんなようなことしてみましたが、やっぱり無理でした。

96:デフォルトの名無しさん
07/07/27 23:00:38
>>95
それでいいんじゃね?
ためしに動かしたら、正常に動いたよ。

#include <stdio.h>

main()
{
        int i,j;
        int num[3][3];
        FILE *fp;
        fp = fopen("num.dat","r");

        for( i = 0 ; i < 3; i ++ ){
                for( j = 0 ; j < 3; j ++ ){
                        fscanf(fp, "%d",&num[i][j]);
                }
        }
        printf("%d %d %d\n", num[0][0], num[0][1], num[0][2]);
        printf("%d %d %d\n", num[1][0], num[1][1], num[1][2]);
        printf("%d %d %d\n", num[2][0], num[2][1], num[2][2]);
        fclose(fp);
}


97:デフォルトの名無しさん
07/07/27 23:16:36
なんで>>96は>95を改悪するんだろう……

98:デフォルトの名無しさん
07/07/27 23:19:05
>>97
printf()以外はコピペだけど?

99:デフォルトの名無しさん
07/07/27 23:20:10
入れる場所が悪いって事でしょ。

100:デフォルトの名無しさん
07/07/27 23:23:11
動作確認用の書き捨てコードで、コレを使えってわけじゃないよ。
>>96で動くんだから、>>95 をそのまま使えばいいよ。

101:デフォルトの名無しさん
07/07/27 23:26:19
main()
これはないだろ

102:デフォルトの名無しさん
07/07/27 23:29:08
できればreturn 0も欲しいところだね。

103:デフォルトの名無しさん
07/07/27 23:30:12
できればセミコロンも欲しいところだね。

104:デフォルトの名無しさん
07/07/27 23:31:32
>>101
リターン値がintで引数0だから、それはまったくおかしくない。

>>102
K&Rも、プログラミング言語C++も、最初の説明用のコードはreturn省略。

105:デフォルトの名無しさん
07/07/27 23:37:55
C++ には main の return 0; は省略可能という正式な仕様がある。

106:デフォルトの名無しさん
07/07/27 23:38:37
>>105
Cでも省略可能。

107:デフォルトの名無しさん
07/07/27 23:41:22
C99 ならね・・・。

108:デフォルトの名無しさん
07/07/27 23:42:10
>>104
あれ、C99でも返り値のINTって省略できたっけ?

109:デフォルトの名無しさん
07/07/27 23:42:46
>>107
C99以前でも省略可。

110:デフォルトの名無しさん
07/07/27 23:47:24
>>109
んなわけねー

111:デフォルトの名無しさん
07/07/27 23:48:09
コンパイラの拡張機能に頼ってると、
規格とか分かんなくなるよね。

112:デフォルトの名無しさん
07/07/27 23:48:53
>>109
とりあえずソース希望

113:デフォルトの名無しさん
07/07/27 23:49:44
>>110
省略してるコード見たことないの?
ぱらぱらとめくってみたら、UNIXネットワークプログラミングのサンプルもreturn省略だな。

114:デフォルトの名無しさん
07/07/27 23:50:14
>>110
省略できるよ、0を返すという意味にはならないけど。

115:デフォルトの名無しさん
07/07/27 23:51:24
確かにエラーにはならんね。

116:デフォルトの名無しさん
07/07/27 23:51:52
>>113
その「サンプル」は規格に準拠したものなのか?
説明の便宜上、省いているだけってことは?

117:デフォルトの名無しさん
07/07/27 23:53:16
>>112
たとえば、ここの、11.12
URLリンク(www.kouno.jp)

> exit()を呼んでもまだ警告が出る のであれば、冗長であるがreturn文を挿入するしかない

return省略すると、警告でるコンパイラもあるけど、そいうのはウンコ。

118:デフォルトの名無しさん
07/07/27 23:56:46
>>116
ANSI準拠のK&Rでも、省略してるし、大丈夫なんじゃないの?

>>96 も動作確認用の書き捨てコードだから、省略したんだけど。

119:デフォルトの名無しさん
07/07/27 23:58:22
>>117
>exit()を呼んでもまだ警告が出る のであれば、冗長であるがreturn文を挿入するしかない
これって「exit()を呼ぶならreturn は省略できる」って意味だと思うけど


120:デフォルトの名無しさん
07/07/28 00:03:40
>>117
んー?
それmain()をvoidと宣言してる場合じゃん

121:デフォルトの名無しさん
07/07/28 00:10:19
>>119
言われてみたら、回答がへんなような気がするね。
なんで最初に「return入れろ」じゃなくてexit()が着てるんだろ。
まあ、returnは省略を前提にしてるQ&Aに見えるけど。

>>120
質問者がvoidにしたいって言うのを、回答者はまっさきに否定してるじゃん。
その後はmain()を前提にした回答でしょ。

122:デフォルトの名無しさん
07/07/28 00:22:18
>>121
こんな感じ(?)

>main()の戻り値は省略できるか?
>できない。main()はintを戻り値とし、(適切な型の)0個か2個の引数 を持つと定義しなければならない。
main()はintを戻り値として返さなければならない.引数も(ry・・・としなければならない
>exit()を呼んでもまだ警告が出る のであれば、冗長であるがreturn文を挿入するしかない
ただし、exit()を呼んだ場合はreturn を省略できるが、それでも警告が出るなら return を記述するしかない
つまり、return (戻り値)を呼ぶか、exit()を呼ぶかであって戻り値を省略できるわけではない

と受け取れる

123:デフォルトの名無しさん
07/07/28 00:27:57
>>122
「exit()を呼んでも*まだ*警告が出る のであれば」
だから、本来はexit()なしでも警告も出ないってことなんじゃない?
で、そのごに「return入れろ」と言ってるということは、exit()もreturnもなしのmain()を
想定した問答なんじゃ?

124:デフォルトの名無しさん
07/07/28 00:38:36
main 関数で return 0; 省略は規格違反。省略した場合の戻り値は未定義。
GCC でいつも -ansi -pedantic -Wall でコンパイルしている俺が言うんだから間違いない。
-std=c99 にすると警告消える。

125:デフォルトの名無しさん
07/07/28 00:39:46
一通りの書き方を妄信する奴はPythonでもやっとけ

126:デフォルトの名無しさん
07/07/28 00:47:03
>>124
リターン値が未定義ってだけで、規格違反ではないよ。
-ansi残して、-Wall消せば警告でないんじゃない?

127:デフォルトの名無しさん
07/07/28 00:50:37
新ANSI C言語辞典で、mainを見ると、返却値が未定義になると書いてあるけど、
その項目のmain()のサンプルは全部return省略してるな。

Cの最小のコードは、main(){ return 0;} じゃなくて main(){}

128:デフォルトの名無しさん
07/07/28 00:55:22
>>126
return の省略とは誰も言ってない。
return 0; の省略と言ってる。

129:デフォルトの名無しさん
07/07/28 00:56:30
>>127
普通のコンパイラを普通に使えば
コンパイラの拡張機能として省略可能にしてあることが多いから
問題が起こることは無いんだろう。

130:デフォルトの名無しさん
07/07/28 01:01:36
>>129
いや、拡張機能じゃないでしょ。
ansi互換のオプションとかでコンパイルできるし。



131:デフォルトの名無しさん
07/07/28 01:04:10
>>129
>コンパイラの拡張機能として省略可能にしてあることが多いから 

どこのコンパイラ?


132:デフォルトの名無しさん
07/07/28 01:34:27
>>96
ありがとうございます。

なぜか自分の方だけはいつまでもできなくて
今まで唸っていたのですが、iとjが同じになっていていました。

133:デフォルトの名無しさん
07/07/28 01:57:05
ていてい!

134:デフォルトの名無しさん
07/07/28 02:16:45
>>127
つまりプログラム自体は未定義でないということでは?

135:デフォルトの名無しさん
07/07/28 08:41:33
>>130
戻り値が 0 になるとは限らないけどな。

136:デフォルトの名無しさん
07/07/28 08:45:55
まとめ

1. main 関数で return を省略する事は可能。しかし、コンパイラによっては警告が出る可能性はある。
2. しかし、C89 の場合は戻り値未定義であり、0 が返るとは限らない。この意味で、return 0; の省略は不可能と言える。
3. C99 や C++ でなら 0 が返る事が保証される。つまり、return 0; の省略は可能である。

137:デフォルトの名無しさん
07/07/28 10:15:13
もう一つ。
関数の戻り値の型はcでは省略可能。その場合、intと仮定される。
main()に関しては、void(=戻り値なし)としている例が散見されるが厳密には処理系依存。
大抵の処理系で許容されているが、その場合コマンドインタプリタへの引渡し値が0になる保障は無い。

138:デフォルトの名無しさん
07/07/28 10:25:02
>>137
C99では、関数宣言で戻り値の型の省略ができなくなったはず。

139:デフォルトの名無しさん
07/07/28 10:27:45
>>138
>cでは

140:デフォルトの名無しさん
07/07/28 10:44:20
C99 が C ではないという口ぶりネ。
そう言いたくなる気持ちは分かるけど。

141:デフォルトの名無しさん
07/07/28 10:50:20
C99なんてCじゃないやい!
とか、余計な方向へ持っていこうとするテスト(って懐かしいなぉぃ)


142:デフォルトの名無しさん
07/07/28 10:58:04
コマンドインタプリタなんて概念は C にはないということもつっこんでいいのかな。

143:デフォルトの名無しさん
07/07/28 12:49:21
>>136
> 2. しかし、C89 の場合は戻り値未定義であり、0 が返るとは限らない。この意味で、return 0; の省略は不可能と言える。 

動作が未定義じゃなくて、リターン値が未定義なだけだから、省略は可能。




144:デフォルトの名無しさん
07/07/28 12:51:03
>>143
もっと読解力をつけた方がいい。

145:デフォルトの名無しさん
07/07/28 12:54:21
>>144
>>143の理解でまったく問題ありません。

146:デフォルトの名無しさん
07/07/28 13:02:56
URLリンク(uploader.fam.cx)

147:デフォルトの名無しさん
07/07/28 13:05:23
>>146
それが何か?

148:デフォルトの名無しさん
07/07/28 13:38:29
>>145
return 0; を期待して return を省略する事はできない、と言ってるんだよ。

149:デフォルトの名無しさん
07/07/28 13:39:53
main が未定義値を返した時の動作が未定義なら、
return を省略する事はできないと言える。
で、どうなんだ?

150:デフォルトの名無しさん
07/07/28 13:55:00
>>148
かなり前から、リターン値は未定という前提で、話は進んでます。

>>149
リターン値は未定義でも、動作は未定義じゃないよ。

151:デフォルトの名無しさん
07/07/28 15:51:08
どうせこうなるんならめんどくても書いたほうがいいと思う初心者だが、
プロはやっぱり出来る限り省略しないといけないぐらい(納期とか)厳しいんだろうか

152:デフォルトの名無しさん
07/07/28 15:54:16
逆だな、普通に書いておくもんだ。

153:デフォルトの名無しさん
07/07/28 16:09:10
return 0;
を書くことで時間が足りなくなることなんてまずないだろw

154:デフォルトの名無しさん
07/07/28 16:37:20
>>150
> 2. しかし、C89 の場合は戻り値未定義であり、0 が返るとは限らない。この意味で、return 0; の省略は不可能と言える。

> return 0; を期待して return を省略する事はできない、と言ってるんだよ。
ということ。
リターン値が未定だからこそ、そうなる。

155:151
07/07/28 16:38:56
いやでもほら、プロの悲惨な現場、って感じの読み物とか時々読んで鬱になるわけだけど、
そこで数万行のコードの話とか出るじゃん
チリも積もれば山となるのかなーと

どちらにせよ初心者が省略なんて覚えたらロクなことにならなそうなんでちゃんと書こうと思った

156:デフォルトの名無しさん
07/07/28 16:41:44
ソースコードが何万行もあってもmain関数が何万個もあるわけじゃないだろw

157:デフォルトの名無しさん
07/07/28 16:43:29
いやだって、プログラム単体ならmain()なんて一個しかないわけだし、
複数プログラムを連携させるようなアプリケーションなら戻り値は必要になるし、
どっちにしても省略するメリットなんて無いよ。
#行単価なんてしょうもない契約だったら尚更省略しないだろうし。

158:デフォルトの名無しさん
07/07/28 16:45:26
そういえばmain関数の話だった
俺アホス

159:デフォルトの名無しさん
07/07/28 17:06:30
return 0; なんて1秒もかからんちん

160:デフォルトの名無しさん
07/07/28 18:07:53
return 0 つー、正常終了なら0を返すという決まりは
UNIXLinuxシステムの依存ものだから
exit(EXIT_SUCCESS); を薦めておく

161:デフォルトの名無しさん
07/07/28 18:09:50
EXIT_SUCCESSが0であることも規格で決まってなかったっけ?

162:デフォルトの名無しさん
07/07/28 20:27:13
決まってる。
main 関数の戻り値は 0 は正常終了、1 は異常終了、
その他は処理系定義という形で規定されている。

163:デフォルトの名無しさん
07/07/28 20:37:44
main の戻り値 = プログラムがその呼び出し元にどういう値を返すか ではないからな。

環境依存の部分は main から戻ったあとで処理系が勝手にやってくれる。

164:デフォルトの名無しさん
07/07/28 20:48:04
C99を使えばmainのreturn 0;は省略できるのに。

165:デフォルトの名無しさん
07/07/28 20:57:21
無限ループに突入したところに恐縮ながら質問するぜ

while( !feof(fp) ) {
 fgetc(fp);
 byte++;
}

で何バイトか計算するんだけど、実際より1バイト大きくなるのはなんでだぜ?
と書いてて気付いたが前判定だから最後のインクリメントが一回分余計なのかな?

166:デフォルトの名無しさん
07/07/28 21:08:26
>>165
fgetc(fp); で最後の一文字を読み込んとすると今はEOFの場所にあるわけだが
その状態でfeof(fp)を呼び出してもEOFを検出しない
現在EOFにある状態でfgetc(fp);を呼び出して初めてfeof(fp)は0以外を返す

while( fgetc(fp)!=EOF ) {
 byte++;
}
にすればよいかと

167:デフォルトの名無しさん
07/07/28 21:09:12
>>165
feofはファイルの最後に来たら0返すんじゃなくて
ファイルの最後(EOF)の読み込み終わったら0返すんじゃなかったっけ?
あとfseekとftell使ってないのはループの仮定でなんか処理入れてるから?

168:デフォルトの名無しさん
07/07/28 21:21:53
>>151
仕事のときには書いたほうがいいよ。
>>96みたいなコードに、return省略するなってツッコミ入れるやつって、
単に揚げ足とりたいだけなんだよ。
returnとfclose()の省略はめっちゃ釣れる書き方だな。
べつに釣ろうと思って書いてるわけじゃないけど。


169:デフォルトの名無しさん
07/07/28 21:23:28
>>166-167
なるほど…
うーん難しい

170:デフォルトの名無しさん
07/07/28 21:30:11
>>167
追記
その二つを使っていないのはとても簡単な理由
まだ知らないからだ

開く・閉じる・EOF検知・エラー検知の関数の解説が終わって練習問題にあった

171:デフォルトの名無しさん
07/07/28 21:39:57
ということは、

/* f1の内容をtempにコピー */

while( !feof(f1) ) {
ch = fgetc(f1);
if( !feof(f1) ) fputc(ch, temp);
}

で判定が重複してるのも同じ理由?
ものすごく使いづらい気がするんですが…

172:デフォルトの名無しさん
07/07/28 21:41:46
そもそもファイルの終端を検出するのに
feofはあまり使わない気がするんだが。
普通入出力関数の戻り値で判定できるし。

173:デフォルトの名無しさん
07/07/28 21:44:43
feofなんて知らなかった

174:デフォルトの名無しさん
07/07/28 21:46:41
>>171
こういうふうに書いてみるとか。

while (1) {
  ch = fgetc(f1);
  if (feof(f1))
    break;
  fputc(ch, temp);
}

ループに突入する前にf1のリードが入ってると、>>171と動作がちがっちゃうけど。

175:デフォルトの名無しさん
07/07/28 21:50:44
ちょっと調べてみるとやっぱり他の処理と組み合わせるなら>>165のようにしたほうがいいって書いてあるな…

しかも解答はあくまでコードだけで説明ないからわからん
危うく\(^o^)/オテアゲ

回答者感謝

176:デフォルトの名無しさん
07/07/28 21:53:31
fgetc()は、エラーとファイル終わりでEOFを返すとあるけど、
feof()はferror()と別関数になってるね。
fgetc()がエラーで、EOFを返すような場合、feof()でループの終了判定してると、
無限ループになったりしないのだろうか。

177:デフォルトの名無しさん
07/07/28 22:13:05
しないだろ。

178:デフォルトの名無しさん
07/07/28 22:20:44
でも可能性は低いだろうけど
while(!feof(fp))
{
ch=fgetc(fp);
if(ch!=EOF) fputc(ch,fp);
}
ってコードがあったとして fgetc()がエラーでEOF返し続けるといつまでたっても !feof(fp) が偽にならず
無限ループになるんじゃない?

179:デフォルトの名無しさん
07/07/28 22:23:25
よく見たらアンカおかしかった

>>175
× >>165
○ >>166

おかげでようやく次に進めました
改めて感謝

180:デフォルトの名無しさん
07/07/28 22:28:02
>>177
ためしてみたら、なった。

181:名無しさん@そうだ選挙に行こう
07/07/29 01:01:02
教科書でfgets()を使ってstr[]にテキストファイルから文字を格納する、ってところで

FILE *fp;
char str[80];

fgets(str, 79, fp);

のように79になってるのはなんでだろう

・str[80]は0-80で(ヌル入れて)81字
・fgets()は指定された数-1まで読み込んで最後にヌルと改行文字をつける

だったらfgets()で80を指定すれば
79字まで読み込み→最後にヌルと改行文字→81字
でstr[80]にぴったりだと思うんだけど…

なんか後半に進んでいくにつれて説明がはしょられるようになってわからないところが多くなってきた…

182:名無しさん@そうだ選挙に行こう
07/07/29 01:05:14
>>181
間違いだらけ。
・先ずその糞本を晒せ。
・char str[80]は80要素、つまり0-79しかない。
・fgets()のパラメータは、そのような使い方の場合fgets(str, sizeof(str), fp)とするのが常道。
・マニュアルページを読めば判るように、fgets()はそれで巧くやってくれる。

183:名無しさん@そうだ選挙に行こう
07/07/29 01:05:44
・str[80]は0-79で(ヌル入れて)80字

だったらfgets()で79を指定すれば
79字まで読み込み→最後にヌルと改行文字→80字
でstr[80]にぴったりだと思うんだけど…

184:名無しさん@そうだ選挙に行こう
07/07/29 01:06:38
fgetsの第二引数はターミネータを含めた長さ
規格嫁やボケ

185:名無しさん@そうだ選挙に行こう
07/07/29 01:07:31
>>183
>182をよく読め。

186:名無しさん@そうだ選挙に行こう
07/07/29 01:08:35
その教科書書いた奴が無知だっただけ。
80でおk。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5371日前に更新/116 KB
担当:undef