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

C言語なら俺に聞け(入門編)Part 92

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2011/11/10(木) 22:55:06.15
C言語の*入門者*向け解説スレッドです。

★前スレ
C言語なら俺に聞け(入門編)Part 91
http://hibari.2ch.net/test/read.cgi/tech/1319581056/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
  ↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 153代目
http://hibari.2ch.net/test/read.cgi/tech/1320365280/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
★ぬるぽ。

長くなりそうなコードはcodepadに貼り付けてもいいでしょう
http://codepad.org/
0232デフォルトの名無しさん2011/11/16(水) 17:23:16.22
あるものを使えということ自体は間違っていないが
もっといいものを作る気がないやつの来るところではない
0233デフォルトの名無しさん2011/11/16(水) 17:30:29.70
コカコーラの秘伝の味に近づけるよう努力するのは無駄だということ
0234デフォルトの名無しさん2011/11/16(水) 19:13:29.79
まずアセンブラから覚えないと
何をやっても砂上の楼閣だよ。
0235デフォルトの名無しさん2011/11/16(水) 19:18:01.67
半田ごてからやり直せ
0236デフォルトの名無しさん2011/11/16(水) 19:30:41.70
>>231
それが必要になるくらいC#を使えるなら、
Cのコードもなんとか読めるくらいにはなってると思う。
0237デフォルトの名無しさん2011/11/16(水) 19:37:00.47
printf("%c\n",20,'*');
上の文の20って、どういう意味があるんですか?
0238デフォルトの名無しさん2011/11/16(水) 19:43:52.06
装置制御4
0239デフォルトの名無しさん2011/11/16(水) 19:47:24.98
>>237
>上の文の20って、どういう意味があるんですか?
10進数の20です。

第一引数の%cに20が対応しているので、ASCIIコード20が表示されますね。
表示できるキャラクタかしら?

それより第3引数は対応する変換器号がないから、どこかコードがおかしくないかな?
0240デフォルトの名無しさん2011/11/16(水) 19:54:14.37
printf("%*c",20,'*');
じゃないの?
0241デフォルトの名無しさん2011/11/16(水) 20:14:02.89
>>240
そうです、書き間違えしてしまいスミマセン。
これを出力すると、20文字分スペースが開いて*が出力されるのですが、
出力桁数を変えるには、%cの部分に20を書かなければならないと習ったので、この20はどういう意味なのだろう?
と思い質問させていただきました。
追記申し訳ないです
0242デフォルトの名無しさん2011/11/16(水) 20:28:32.17
ttp://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/printf.3.html
フィールド幅
0243デフォルトの名無しさん2011/11/16(水) 20:33:08.30
>>242
なるほど、*を付けると次の引数分スペースを開けて出力という意味になるのですか
ありがとうございました。
0244デフォルトの名無しさん2011/11/16(水) 20:35:38.91
えっ?
0245デフォルトの名無しさん2011/11/16(水) 20:38:25.57
えっ?
0246デフォルトの名無しさん2011/11/17(木) 01:12:11.38
FFTのプログラムなんですが、実行するとSegmentation faultになってしまいます。
どこが原因なんでしょうか?

http://codepad.org/Sm40ZyMW
0247デフォルトの名無しさん2011/11/17(木) 01:16:08.82
デバッガ使ってないの?
0248デフォルトの名無しさん2011/11/17(木) 01:26:37.88
>>246
>fscanf(fpr,"%d",d);

fscanf(fpr,"%d",&d);

これじゃね?
ぱっと見だけでまじめに読んでないけど。

0249デフォルトの名無しさん2011/11/17(木) 01:35:04.82
>>247
gdbを使おうとしたのですが、まだ良く分かっていなくて…

>>248
それでした!完全に見落としてました。
ありがとうございました。
0250デフォルトの名無しさん2011/11/17(木) 01:36:35.19
俺Cはよく知らないんだけど、double sin(),cos();ってどういう意味なの?
0251デフォルトの名無しさん2011/11/17(木) 02:04:35.99
double型変数sinとcosを0で初期化する
0252デフォルトの名無しさん2011/11/17(木) 02:24:03.14
ありがと。
0253デフォルトの名無しさん2011/11/17(木) 02:29:28.94
いやいやいやいやw
0254デフォルトの名無しさん2011/11/17(木) 04:51:33.27
プロトタイプ宣言
0255デフォルトの名無しさん2011/11/17(木) 04:54:24.86
>>250
昔の流儀で、プロトタイプ宣言の代わりに自前で関数を宣言している。
今なら、#include <math.h>で事が足りる。
0256デフォルトの名無しさん2011/11/17(木) 13:32:18.44
>>251
あほw
0257デフォルトの名無しさん2011/11/17(木) 13:42:35.10
引数なしのsin cos関数ってこと?
0258デフォルトの名無しさん2011/11/17(木) 14:39:47.81
古のK&Rではコール側がお掃除する前提だから引数プロトタイプなんて飾りなんだよ
0259デフォルトの名無しさん2011/11/17(木) 18:06:48.93
>>258
(・∀・)ニヤニヤ
0260デフォルトの名無しさん2011/11/17(木) 18:07:29.88
>>258
アホすぐる
0261デフォルトの名無しさん2011/11/17(木) 18:18:37.91
すみません
関数の中にある、変数宣言や代入、他の関数の呼び出し、IF文など、まとめてなんと呼ぶんでしょうか?
ステートメントと呼んでいる文献もありましたが入門書だと触れてないのが多くて困っています。
名前なんてどうでもいいという意見もあるかも知れませんが・・・。
0262 ◆QZaw55cn4c 2011/11/17(木) 18:25:52.70
>>258
cdecl なら今でも。あと、構造体をもらったり返したりするようになってからは、やっぱりいるんじゃないかな。
0263デフォルトの名無しさん2011/11/17(木) 18:33:18.49
>>261
ステートメントか文でいいよ
0264デフォルトの名無しさん2011/11/17(木) 19:17:07.14
>>261
入門書にイラつけるようになったら規格票買え
0265デフォルトの名無しさん2011/11/17(木) 19:41:24.36
実数型変数で、指数部を符号なし整数として
オフセットを用いて表現するにはどうすればいいですか?
0266デフォルトの名無しさん2011/11/17(木) 20:23:35.89
Cなら

return 2;
printf("d");

はOKだけど

javaだと

return 2;
println(3);

だとエラーがでる?

これはプログラミング言語のコンパイラ及び実行マシンのどのような
性質によるものか?

レポートの問題なんですが良く分かりません。
0267デフォルトの名無しさん2011/11/17(木) 20:25:40.60
つまり何故Cではreturnの後に処理がかけるのかっていうことです。
0268デフォルトの名無しさん2011/11/17(木) 20:28:46.47
無限ループの後に、returnがあってもいいよね?
0269デフォルトの名無しさん2011/11/17(木) 20:42:23.13
本当に「レポートの」問題だな
「OKだけど」とあるが、そのあと二重質問で「エラーが出る」のはなぜかになっている
0270デフォルトの名無しさん2011/11/17(木) 20:46:44.64
>>266
単純にそういう言語仕様だからってだけのような気がするけど、なんか深い理由でもあんのかね。
javaのほうが後発だからチェックが厳しくなってるとか。
02712662011/11/17(木) 21:09:21.88
>>269
嘘ついてすいませんw
自分が疑問に思った質問ですww


レポートと言ったら皆はりきってやってくれるかとおもいましたw
0272デフォルトの名無しさん2011/11/17(木) 21:11:08.08
Cなら警告だね。まぁgotoで飛べるし、構文上も問題ないし余計なことは
しないっつーポリシーだからじゃね?
Javaだとエラー扱いなのか?
0273デフォルトの名無しさん2011/11/17(木) 21:21:37.35
javaだとエラーなの?
暫定的に処理を打ち切りたいときとかめんどくさそうだね
0274デフォルトの名無しさん2011/11/17(木) 21:25:54.19
苦Cが書籍化されたの今日本屋で見つけた
内容はwebとまったく同じだった
0275デフォルトの名無しさん2011/11/17(木) 21:30:41.91
unreachable statementってエラー
0276デフォルトの名無しさん2011/11/17(木) 22:41:43.11
ひどいな。Java。
0277デフォルトの名無しさん2011/11/17(木) 22:54:01.00
失礼します。
K&Rにしたがって以下のようなコードをコンパイルしました。
#include <stdio.h>
main(){
int c;

while( (c = getchar()) != EOF )
putchar(c);
}

実行したところ、入力した文字列はコピーされたのですが、その後入力待ち状態になります。
いろいろと実験したところ、getchar関数で最後に読み込まれている文字は'\n'のようで、
while文の条件式を(c = getchar()) != '\n'に変えると文字列コピー後プログラムが終了しました。
どうしてこのようにテキストと違う結果になるのでしょうか?
よろしくおねがいします。
0278デフォルトの名無しさん2011/11/17(木) 22:55:12.98
>>277
君がそういう環境でやっているからだよ。
0279デフォルトの名無しさん2011/11/17(木) 23:01:24.83
>>278
それはK&Rの想定するマシンでは最後に読み込まれるのはEOFだけれど、
自分のマシンでは\nになってしまっているためにwhile文が無限ループになっているという解釈で
良いのでしょうか?
0280デフォルトの名無しさん2011/11/17(木) 23:04:07.92
>>277
DOSのときは、Ctrl-ZでEOFが入力できたから、windowsでも同じなんじゃないの?
unix系は知らないけどEOFを入力する方法があるはず。
0281デフォルトの名無しさん2011/11/17(木) 23:23:48.56
RUBY参考書の文字列の所読んでたら、正則表現っていう言葉が出てきたんだけど
正規表現とか正則表現ってどういう意味ですか?

プログラムではなく言語の一般的な概念らしいけどどういうことですか?
掻い摘んで教えてください。
0282デフォルトの名無しさん2011/11/17(木) 23:44:11.03
>>277
unix系なら ^D で入力おしまい。
0283デフォルトの名無しさん2011/11/17(木) 23:45:28.61
>>281
http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE
0284デフォルトの名無しさん2011/11/17(木) 23:46:39.09
>>279
お前、Enterキーを押してないか?
0285デフォルトの名無しさん2011/11/17(木) 23:58:03.08
>>284
押してますが・・・
わざわざEOFを>>280>>282のように手でEOFを入力しないといけなかったんですか?
てっきり自動的にEOFが最後に読み込まれるのかと思ってましたが・・・
0286デフォルトの名無しさん2011/11/18(金) 00:02:57.81
>>285
標準入力から入ってくるものは改行も含めて全部読むんだよ。
だから改行を入力したらgetchar()は'\n'を返す。
何も読めるものがなくなったらEOFを返して終わりだって事を示すの。
0287デフォルトの名無しさん2011/11/18(金) 00:10:57.82
だから標準入力なら自分でEOFを入力するんですね。
みなさん長々とありがとうございました。
0288デフォルトの名無しさん2011/11/18(金) 00:16:28.45
EOFを入力するんじゃなくて、特定の操作で入力を終わりにするんだよ。
そうしたらgetchar()はもう終わりだよという意味でEOFを返すの。

標準入力がファイルに繋がってる場合なら、getchar()を繰り返せば
ファイルの中身が「終わり」まで全部読めるわけ。
最初の1行だけとかじゃなくてね。
0289デフォルトの名無しさん2011/11/18(金) 00:21:25.14
なるほど
上のCtrl+DなどはEOFという値ではなく、「入力終わり」を示してるってことですね?
理解が遅くて申し訳ないです。
0290デフォルトの名無しさん2011/11/18(金) 01:53:56.15
いやいや、勘のいい方だと思うよ。
中には「EOFを入力する」なんて言い張るのもいるからね。
0291デフォルトの名無しさん2011/11/18(金) 03:12:08.11
ファイルにEOFを入力したいんだけど、どうしたらいい?
0292デフォルトの名無しさん2011/11/18(金) 03:35:14.50
>>291
ネタはいいから。
0293デフォルトの名無しさん2011/11/18(金) 08:19:52.62
閉じればいいと思うよ
0294デフォルトの名無しさん2011/11/18(金) 09:33:42.86
ファイルにEOFを入力する方法はないの?
UNIXの場合なら、^D、DOSの場合なら^Zを
データとしてコンソールから入力したい時、
どうするの?
0295デフォルトの名無しさん2011/11/18(金) 09:54:09.09
^Dや^Zを打てばいいだけだ。
0296デフォルトの名無しさん2011/11/18(金) 10:06:03.96
scanf 関数で文字列を読み込む際、&が必要でない理由ってなに?
0297デフォルトの名無しさん2011/11/18(金) 10:22:00.59
>>294
どうしても必要なら、unix系はsttyコマンドでeofを別の文字に割り当てられるけど、
エディタで予め作っておいた方がいいんじゃね?

0298デフォルトの名無しさん2011/11/18(金) 10:25:18.35
>>294
ファイル内にEOFを書くためには
ファイルシステムから選びなおさないとダメだよ
FAT とか NTFS とか ext2 ext3 なんかはダメだね
0299デフォルトの名無しさん2011/11/18(金) 10:52:57.80
>>296
配列の場合、随所でCが勝手にポインタ型に変換するから。
char s[]; の場合、sと書くと、ほとんどの場所で自動的に &s[0] に変換される。
0300デフォルトの名無しさん2011/11/18(金) 12:56:57.71
wchar_tっていうのは文字列を対象としたアルゴリズムを書くのが楽だから存在してるんですか?
0301デフォルトの名無しさん2011/11/18(金) 16:36:07.36
>>300
何も言わずにTCHARでググれ。
そして何も考えずに一番互換性のある文字型を使え。
0302デフォルトの名無しさん2011/11/18(金) 16:47:59.36
TCHARなんてWindowsの世界に引きこもる時しか使えないし、
それが何なのか理解してないと混乱するばかりだと思うけど。
0303デフォルトの名無しさん2011/11/18(金) 18:48:25.08
「ワイド文字」と「マルチバイト文字」でググった方が収穫が大きいと思う
0304デフォルトの名無しさん2011/11/18(金) 19:36:37.56
>>296
scanf()が欲しいのはデータを格納する先であり、変数の中身ではない。
だから殆どのものは変数名に&をつけ、変数の中身ではなく、場所をscanf()に教えている。
(つけないとそれはただの「式」であり、結果として変数の「中身」を渡してしまうことになる)

でも、文字列を読み込むときに与えるのは配列名。
[添字]を後ろにつけずに配列名だけ書いた場合、
それが意味するのは配列の内容ではなく「配列のデータを格納している場所」そのものだからね。
場所を与えているのだから、書かなくて正解なのよ。
0305デフォルトの名無しさん2011/11/18(金) 19:42:20.59
utf8のファイルを読み込んで
そのまま出力したらバグるのはなんで?
0306デフォルトの名無しさん2011/11/18(金) 19:43:32.23
>>305
ターミナルの設定ができてないから
0307デフォルトの名無しさん2011/11/18(金) 19:44:44.27
環境を言わないと
0308デフォルトの名無しさん2011/11/18(金) 21:08:26.05
char A[10];

for(i=0; i<10; i++)
{

for(j=0; j<10)A[j]=

}

←
forの中のforみたいに箱入り娘になってるA[]が

二重forを抜けたら元々のAに戻ってるのですが何故ですか?
二重forによって得られたAが欲しいのに二重forを抜けたら
その得られたAじゃない。
0309デフォルトの名無しさん2011/11/18(金) 21:10:09.74
何を言ってるかわからない
0310デフォルトの名無しさん2011/11/18(金) 21:13:14.52
>>308
省略せずにソース全部書かないと、意味不明
03113082011/11/18(金) 21:46:22.88
#include<stdio.h>
#include<string.h>
int main(void)
{
char C[10]; int i,j;
for(i=0; i<10; i++)
{
char G[10]; sprintf(G,"%d",1234);
for(j=0; j<10; j++){C[i]=G[j];printf("%c\n",C[i]);}
}
printf("C=%s",C);
}
何故か配列の値がforを抜けると変わっているという・・・ わけがわかりません。
03123082011/11/18(金) 21:48:44.60
#include<stdio.h>
#include<string.h>
int main(void)
{
char C[10]; int i,j;
for(i=0; i<10; i++)
{
char G[10]; sprintf(G,"%d",1234);
for(j=0; j<10; j++){C[i]=G[i];printf("%c\n",C[i]);}
}
printf("C=%s",C);
}

訂正しました。 j→i 下から4行目
0313デフォルトの名無しさん2011/11/18(金) 21:50:37.10
>>311
途中で NUL文字が入るから
0314デフォルトの名無しさん2011/11/18(金) 21:56:59.39
>>312
それ、Cに"1234"って文字列が入る動作だけど、どう動いて欲しいの?
0315デフォルトの名無しさん2011/11/18(金) 22:06:30.22
意味が分からんな。j のループ内で j 使ってないし。
C[0]=G[0] を10回実行して何がしたいんだ
「どうなってほしいのに」「こうなってしまう」って具体的に書いてくれ
0316デフォルトの名無しさん2011/11/18(金) 22:11:31.07
>>311-312
http://codepad.org/lVZY9Y7D

正しく動いてると思うけど?
03173082011/11/18(金) 22:26:27.93
それと、%cで一つずつ表示しようとすると、全部表示されるのに
例えば strが abc re tみたいなのだと、 %cで表示しようとすると
abc re tと出ますが

%s表示だと何も表示されません?何故ですか?

for(i){printf("%c",str[i])};←表示される

printf("%s",str);←表示されない

0318デフォルトの名無しさん2011/11/18(金) 22:33:08.59
まあ、なんていやらしい><
0319デフォルトの名無しさん2011/11/18(金) 22:35:20.18
>>317
えろいマーク書く前に落ちついて。
ちゃんとでるよ
03203082011/11/18(金) 22:36:26.91
>>316
すいません・・・
結局>>317につきました・・・
0321デフォルトの名無しさん2011/11/18(金) 22:38:29.11
せめて日本語で書け。
0322デフォルトの名無しさん2011/11/18(金) 22:39:55.71
http://codepad.org/Q8UjVj0k

%c で一文字ずつ表示しようが %sで表示しようが、ちゃんと動いてるよね。
>>308はいったいどこでC言語を学んだんだ。
もし入門書とかで勉強したなら、変な入門書は窓から投げ捨てろ。
03233082011/11/18(金) 22:41:00.29
表示されないんですが・・・

何故でしょう?

forの二重の前にchar Aと宣言してるんです。

二重の中でAに文字が代入されて

さぁprintf("A=%s",A);とするとA=    となるんです。
でもfor(i=0; i<10; i++)printf("%c",A[i])とすると、
abc re とでます。
何故でしょう?
string.hはちゃんとヘッダで読み込んでます。
0324デフォルトの名無しさん2011/11/18(金) 22:43:19.67
K&R第二版以外の本で勉強するからそんなことになるんだよ。
03253082011/11/18(金) 22:48:20.65
#include<stdio.h>
#include<string.h>
int main(void)
{

char A[10];

A[0]='S';


printf("%s",A);

}

の場合はちゃんとSがでました。\0を入れてないから文字化けした部分はありますが。
0326デフォルトの名無しさん2011/11/18(金) 22:50:13.18
>>323
Aは初期化してるの?
変数は宣言したら初期化しておかないと変なバグを生み出す可能性があるよ。

いったい何がやりたいんだろう?
0327デフォルトの名無しさん2011/11/18(金) 22:50:41.21
string.hいらない
%sで文字列出力するとき、最後に改行入れてみ
0328デフォルトの名無しさん2011/11/18(金) 22:54:06.37
末端が \0 で終わって無くて
ごみ中の CR を受けて表示端末行頭に戻って
(でも LF居ないので次の行にいかず)
続く文字が非表示可能文字かスペースで消された
なんてことはないよな?

リダイレクトしてファイルに出力:バイナリエディタで確認すりゃわかるかもしれないが
0329デフォルトの名無しさん2011/11/18(金) 22:56:59.86
それが起こりうる状況を提示できるならその可能性があるといってもいいが、ないよね。
0330デフォルトの名無しさん2011/11/18(金) 23:00:25.71
いったい何がしたいんだ?
表示されないと言っているが、どう表示してほしいんだ?
デバッグしてやるからソース全文さらせ。
03313082011/11/18(金) 23:06:32.17
>>328
あ、その可能性かもしれません。
ちょっと調べます。
■ このスレッドは過去ログ倉庫に格納されています