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/
0655647
2006/11/23(木) 14:51:33○やりたいことはmallocとかでとった領域に入ってるどこかで入れた内容のサイズをしりたいことでした。
0656ぴゅあ
2006/11/23(木) 15:03:28>mallocとかってサイズ調整してるみたいだし。
これはコード上より内部的な話なので、考えなくていいと思います
(>mallocとかでとった領域のサイズをしりたいことでした。
mallocの際に必ずサイズを渡している筈なので、それを渡せていればいい…ですね)
0657デフォルトの名無しさん
2006/11/23(木) 15:29:16ファイルからの読み出しで最大値、最小値を表示するプログラムなんですが、
数字以外が含まれるとループし続けてしまいます。
エラーを返すようにしたいのですが、どうすればいいでしょうか?
0658デフォルトの名無しさん
2006/11/23(木) 15:30:13scanf を使わず getcharを使う
0659デフォルトの名無しさん
2006/11/23(木) 15:34:400660647
2006/11/23(木) 15:42:34配列のサイズのとりかた
unsigned char hoge[255];
printf("length = %d\n", sizeof(hoge) / sizeof(unsigned char);
ですね。ありがとうございます。
0661ぴゅあ
2006/11/23(木) 15:49:55スルーっぽさを漂わせてるみたいだから別にいっか
0662ぴゅあ
2006/11/23(木) 16:36:32However, it is not a pure mind.
It is a question though is sudden.
Do you think that I am a person in question?
Or, the pretender?
Do you understand?
0663デフォルトの名無しさん
2006/11/23(木) 16:41:46sizeof(hoge) / sizeof(hoge[0])
hoge が構造体でもどんな型でもつかえる。
0664デフォルトの名無しさん
2006/11/23(木) 16:44:04my.name = pure;
it = my.
however(it!=pure.mind);
assert(it & (QUESTION | SUDDEN));
you = I == person[QUESTION] ? 1: I==PRETENDER ? 2: ~UNDERSTAND;
0666623
2006/11/23(木) 17:52:46(u)int_fast32_tはピッタリ32bitの事かと勘違いしてました
0667デフォルトの名無しさん
2006/11/23(木) 18:04:50数値の取得にfscanf()を使っているならfgets()+sscanf()にして戻り値をチェックしたまえ。
sscanf()の代わりに、strtol()/strtod()で変換終了点をチェックしてもいいけど。
0668デフォルトの名無しさん
2006/11/23(木) 19:46:58fscanf()のリターン値のチェックがEOFしかやってないじゃん。
1以外だったらループを抜けるって処理も入ってないと。
0669デフォルトの名無しさん
2006/11/23(木) 20:34:20C++では定数はconstで定義することが普通のようですが、Cではどうなんでしょうか?
色々なサイトを見てみると、#defineでやってるのが多いようですが。
なぜconstで定義しないのでしょうか?
もう一つ、ヘッダファイルにconstで定数を定義しようと考えたのですが、どちらが
一般的でしょうが?
1.ヘッダファイルにstatic constで定義する。
2.ヘッダファイルに対応する.cファイルに実体を定義し、ヘッダファイルでexternする。
0670デフォルトの名無しさん
2006/11/23(木) 21:16:38Cではconstで定義したものを、定数式が要求されるところ
(配列宣言時の要素数やcaseラベルなど)で使うことができない。
そんなCを見て、C++ではconstで定数を定義できるようになった。
だからCでヘッダにconstな変数宣言をおくのは、そもそも一般的ではない。
C++では、staticなしでconst使うが(少なくとも整数型ではそれで問題ないようになっている)。
0671デフォルトの名無しさん
2006/11/23(木) 21:25:300672デフォルトの名無しさん
2006/11/23(木) 21:50:06どうなるか俺は規格書を見ないとわからない。
0673デフォルトの名無しさん
2006/11/23(木) 22:10:48文字列とか,実数でなにかあるのかと思った.
0674669
2006/11/23(木) 23:26:18Cではconst変数と定数は区別しなくちゃいけないんですね。
で、定数と同じ使い勝手を保ちつつ定数に名前を付けるとしたら
#defineしかない、ということですか。
良く分かりました。有難うございました。
0675デフォルトの名無しさん
2006/11/24(金) 00:17:32どうやってやるんでしょう。
0676デフォルトの名無しさん
2006/11/24(金) 00:19:58カレントディレクトリのファイルと要領は同じ。開くファイル名を相対パス名にすればいいだけ。
0677675
2006/11/24(金) 00:32:27レスサンクス
if((sfp = fopen(..\fff.txt,"r"))==NULL)
puts("コピー元、オープンできませんでした。");
0678デフォルトの名無しさん
2006/11/24(金) 00:33:410679675
2006/11/24(金) 00:34:43コンパイルエラーでございます。
0680デフォルトの名無しさん
2006/11/24(金) 00:35:03..\fff.txt
これ”..\\fff.txt” じゃなきゃダメなんジャマイカ?
0681デフォルトの名無しさん
2006/11/24(金) 00:35:20↓
if((sfp = fopen("../fff.txt","r"))==NULL)
0682675
2006/11/24(金) 00:37:26すげーありがと
またよろしくーーーwww
0683デフォルトの名無しさん
2006/11/24(金) 02:05:080684デフォルトの名無しさん
2006/11/24(金) 02:06:150685デフォルトの名無しさん
2006/11/24(金) 02:12:340686デフォルトの名無しさん
2006/11/24(金) 05:51:10定数ならenum 使うべき。
0687ぴゅあ
2006/11/24(金) 07:52:52適材適所でしょ
>>679
ちっちゃいツッコミですけど
>一つ上のカレントディレクトリ
カレントディレクトリの一つ上の(カレントとは言わない)ディレクトリ
と呼ぶです
>>683
Cでは0(偽)ではない値を真(0以外)と捉えてやってください
whileと組み合わせてwhile(1)は"無限にループさせたい"
0688デフォルトの名無しさん
2006/11/24(金) 11:09:260689デフォルトの名無しさん
2006/11/24(金) 11:16:230690デフォルトの名無しさん
2006/11/24(金) 11:26:54#define ever (;;)
for ever
とか、
#define _
for (;_;)
とか。
0691デフォルトの名無しさん
2006/11/24(金) 12:43:40#include<stdio.h>
#include<string.h>
void wait(int tm)
{int i,j;
for (i = 1;i < tm; i++)
for(j = 1;j < tm; j++){
double x = sin(i) * cos(j);}}
int main(void)
{
int cnt = 0;
char mes[] = "あいうえ";
int len = strlen(mes);
while(1){
int i;
putchar('\r');
for (i = 0;i<strlen(mes);i+=2){
if(cnt + i<len){
putchar(mes[cnt + i]);
putchar(mes[cnt + i+1]);}else{
putchar(mes[(cnt + i) % 8]);
putchar(mes[(cnt + i+1)%8]);}}
wait(2000);
if(cnt < len - 1)
cnt+=2;
else
cnt = 0;
}return(0);}
これを右に流れるようにしたい
0692デフォルトの名無しさん
2006/11/24(金) 12:45:300693デフォルトの名無しさん
2006/11/24(金) 12:46:370694デフォルトの名無しさん
2006/11/24(金) 13:05:42例えば set の次の0を1に変える方法です。
助言プリーズ
while(*fp[pt] != '\0') && (temp[pp] != '\0')){
if(*fp[pt]== temp[pp]){
pt++;
pp++;
}
else{
pt=pt-pp+1;
pp=0;
}
}
if(temp[pp]=='\0'){
while(*fp[pt] != "A-Z" || *fp[pt] != "a-z" ){
switch(*fp[pt]){
case ' ': pt++; break;
case '0': *fp[pt]='1';
puts("0を1に書き換えました");
break;
case '1': puts("すでに1です。");
break;
}
}
puts("処理は無事、終了しています。");
長くてすみません。
0695デフォルトの名無しさん
2006/11/24(金) 13:08:28この条件が真になるの?
0696695
2006/11/24(金) 13:23:50この条件が偽になるの?だな
0697デフォルトの名無しさん
2006/11/24(金) 13:27:50ちょっと書き替える程度のことでそんなキメーことすんなよ。
0698デフォルトの名無しさん
2006/11/24(金) 13:28:41man sed
0699デフォルトの名無しさん
2006/11/24(金) 13:28:58>while(*fp[pt] != "A-Z" || *fp[pt] != "a-z" ){
ローマ字以外の時だけ繰り返すって意味なら
while !((*fp[pt] >= 'A' && *fp[pt] <='Z') || (*fp[pt] >= 'a' && *fp[pt] <= 'z') ){
こんな感じになる
0700694
2006/11/24(金) 13:31:04*fpはFILE型のポインタでchar型でなく、int型としてしか取り扱えない
ようなエラー内容。fopen関数でfpに変更したいファイルを'r+'で
オープンしています。
695の内容はsetの次の数字以外の文字が来たときにはプログラムが終了
するような意図を持って記入しました。英文字が来たら終了の意図です。
自信ないんですが。
0701デフォルトの名無しさん
2006/11/24(金) 13:32:24while(!isalpha(*fp[pt]))
0702デフォルトの名無しさん
2006/11/24(金) 13:33:09直接 *fp or fp[] で操作する と想像したお前に完敗
0704デフォルトの名無しさん
2006/11/24(金) 13:35:570705デフォルトの名無しさん
2006/11/24(金) 13:46:02それでもコンパイルは通るだろ。
char **fpとかじゃねぇの?
0706694
2006/11/24(金) 16:56:30レスくれた人、有難う。
勘だらけで内容くちゃぐちゃだけど、
結果オーライ。
0707デフォルトの名無しさん
2006/11/24(金) 17:19:43終了したか監視したいんだけども
どうやるんざますの?
0708デフォルトの名無しさん
2006/11/24(金) 17:34:33>>1
0709デフォルトの名無しさん
2006/11/24(金) 17:34:550710ぴゅあ
2006/11/25(土) 00:29:31あちしの場合はwhile (1)よりfor ( ; ; )を好んで使いますね
賢いコンパイラならwhile (1)をfor ( ; ; )として解釈してくれそうでもあるけど
なんか「キメェ」って感じなので。。。(使い方合ってます?)
(while(1)は、毎回「1だよね」って確認してくれてそうな…)
#define forever() for ( ; ; )
とかすることもあったりするけど(色んなコードを見てるとそんな風にしているのも多くあったりする?し)
サラッと書いて済ますときは(特に)for ( ; ; )だったりですけど
実際while(1)を使うかfor ( ; ; )を使うかはそのときの気分?かな
圧倒的にfor ( ; ; )の方が多いのは間違いないけど
仕様もない話ですが。。。
0711デフォルトの名無しさん
2006/11/25(土) 00:37:14while(1)を最適化しないコンパイラなんて糞コンパイラだ。
for(;;)はANSIが無限ループのために規格化した書き方だ。
0712デフォルトの名無しさん
2006/11/25(土) 00:41:07for ( ; ; ) ; /* 悲しそう */
while (1) ; /* ょぅι゛ょの割れ目?卑猥です */
0713デフォルトの名無しさん
2006/11/25(土) 08:02:35while(1) はもう while(1) というパターンとして認識されてるから、正直どっちでもいいと思うぜ。
0714デフォルトの名無しさん
2006/11/25(土) 09:15:280715デフォルトの名無しさん
2006/11/25(土) 09:51:26以外のファイルってなんなの?
.makと.objと.tdsなんだけど。
教えてくださらんか。
0716デフォルトの名無しさん
2006/11/25(土) 09:53:30C言語で他の実行ファイルを実行させたい場合、
どういう風に記述すればいいのだろうか。
0717デフォルトの名無しさん
2006/11/25(土) 09:56:35while (1==1)
だな。
0718デフォルトの名無しさん
2006/11/25(土) 11:08:35.makはコンパイル時には作られないだろう
BCCDeveloperかなんか使ってるんじゃねーの?
ちなみに.makはメイクファイルといってコンパイルやリンク時の手順を記述したもの
自分で書いたりIDEが吐いてくれたメイクファイルを元にコンパイル等を実行する。
tdsは何か忘れた
.objは純粋にコンパイルしたときに作られるオブジェクトファイル
本来EXEを生成するには
・hoge.cをコンパイルしてhoge.objを生成
・hoge.objと必要なライブラリ等をリンクしてEXE生成
という大まかに分けて2つの手順を踏む必要があるが、
bccは-cオプションをつけない限り、リンクも自動的にやってくれるようになっている
間違ってるかもしれないけど、大体こんな感じ
0719715
2006/11/25(土) 11:32:22回答どうもありがとう!
0720ぴゅあ
2006/11/25(土) 13:21:20system関数周りとかexec系の関数辺りとかを見てみれば
>>714
当然パターンとしてコンパイラは認識する筈だけど
中身(式)なしのforがどうなるかだろうけど
アセンブラをずっとやっているときにCが出てきて
アセンブラからCを中から見て理解したけど(特にポインタとか)
中身なしのforは中身なしのコードで出てきてた記憶はあるけど
いずれにしても余程変なことでもしてなきゃ
好みで選んでいいだろうと思うけど
>>711
ANSI Cが定められたのを知っても特に興味も沸かなくて
気にしてこなかったけど
あちしがずっと好んでだけで使ってきてたことを
適切であっただろうとわざわざ立証してくれてありがとう
0721デフォルトの名無しさん
2006/11/25(土) 13:27:590722デフォルトの名無しさん
2006/11/25(土) 13:43:27?
0723デフォルトの名無しさん
2006/11/25(土) 13:52:57http://pc8.2ch.net/test/read.cgi/tech/1162999861/l50
Cなら俺に聞け(応用編)
http://pc8.2ch.net/test/read.cgi/tech/1163246166/l50
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/l50
くだすれC言語(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1153542424/l50
渡辺篤史のGoogle Code Search探訪
http://pc8.2ch.net/test/read.cgi/tech/1160188096/l50
どこに質問していいのか分かりません
ビットシフトについてなんですが・・・
0724デフォルトの名無しさん
2006/11/25(土) 14:10:210725デフォルトの名無しさん
2006/11/25(土) 14:34:11夏休みはまだ早いぞ
0726デフォルトの名無しさん
2006/11/25(土) 15:22:470727デフォルトの名無しさん
2006/11/25(土) 19:40:35ぐしゃぐしゃです。
助言くれーー。
0728デフォルトの名無しさん
2006/11/25(土) 19:42:030729デフォルトの名無しさん
2006/11/25(土) 19:42:32#define NUM 500
int main(){
FILE *fp;
int ch;
int chx[NUM]={0};
int i=0;
0730デフォルトの名無しさん
2006/11/25(土) 19:43:09puts("読み取りオープン失敗");
else{
puts("元の内容");
while((ch=fgetc(fp)) != EOF){
chx[i]=ch;
putchar(chx[i]);
i++;
}
}
putchar('\n');
0731デフォルトの名無しさん
2006/11/25(土) 19:44:09puts("配列chxの内容");
for(i=0;i<NUM;i++)
putchar(chx[i]);
getchar();
return 0;
}
0732727
2006/11/25(土) 19:45:040733727
2006/11/25(土) 19:47:510734727
2006/11/25(土) 19:58:04設定配列数オーバーしても関係ないんですね。
>>720どうもありがとう、ぐぐってみます!
0735デフォルトの名無しさん
2006/11/25(土) 20:06:58iがNUM以上になるのを何故放置するのか?
0736デフォルトの名無しさん
2006/11/25(土) 20:08:50#include <stdio.h>
#define SIZE 1000
main(){FILE *fp; int i, c, chx[SIZE];
if((fp=fopen("C:\\tools\\ten.bat","r")) ==NULL) puts("どんまい");
else {puts("もとの");
for (i=0; i<SIZE && (c=fgetc(fp))!=EOF; i++) putchar(chx[i]=c);
chx[i]='\0';}
getchar(); puts("\nはいれつのなか");
for (i=0; i<SIZE && chx[i]; i++) putchar(chx[i]);
getchar();return 0;}
0737デフォルトの名無しさん
2006/11/25(土) 20:25:040738デフォルトの名無しさん
2006/11/25(土) 20:26:480739デフォルトの名無しさん
2006/11/25(土) 20:28:00#define SIZE 1000
for (i=0; i<SIZE
chx[i]='\0';
’SIZE’以上のファイルだと i は1000になって chx のサイズオーバー
0740デフォルトの名無しさん
2006/11/25(土) 20:59:53>>737
ゴメンなさい。反省してます。
0741716
2006/11/25(土) 22:12:56こんな感じにやって駄目でした。
#include <stdio.h>
#include <process.h>
int main(){
execv("C:\\tools\\ten.bat",NULL);
getchar();
return 0;
}
ヒントいただけないでしょうか
0742デフォルトの名無しさん
2006/11/25(土) 22:30:570743716
2006/11/25(土) 22:57:04#include <process.h>
int main(){
system("C:\\tools\\ten.bat");
getchar();
return 0;
}
あっさりできたw
どうもありがとうございます。
0744デフォルトの名無しさん
2006/11/26(日) 01:26:501個の構造体では出来たのですが、一つのファイルに二つ以上入れたとき、一つ目のデータが破棄されてしまうのです。
具体的には
1、no番目の構造体データをfseek(fp,no*sizeof(str),SEEK_SET)後fwrite(&str_a,sizeof(str),1,fp)で入力。
2、別のnoについて同様に入力。
3、確認の為、no番目のデータををfseek(fp,no*sizeof(str),SEEK_SET)後fread(&str_b,sizeof(str),1,fp)でstr_aにコピー。
4、printfでstr_bの中身を見ると、0になっている。
コンパイルエラーは起きないし、もちろんメモリ保護違反等も起きてないのですが…
0745デフォルトの名無しさん
2006/11/26(日) 01:28:58ソースコードを晒して
0746デフォルトの名無しさん
2006/11/26(日) 01:30:59んでstr_bはどこで読み込んでんの?
0747デフォルトの名無しさん
2006/11/26(日) 01:48:46{
int no,sel;
str_a alpha;
FILE *fp;
printf("plz input no\n");
scanf("%d",&no);
printf("plz input RorW(W=1,R=2)\n");
scanf("%d",&sel);
switch (sel){
case 1:
fp=fopen("data.bin","wb");
fseek(fp,sizeof(str_a)*no,SEEK_SET);
printf("plz input a,b,c\n");
scanf("%d%d%d",&alpha.a,&alpha.b,&alpha.c);
fwrite(&alpha,sizeof(str_a),1,fp);
break;
case 2:
default:
fp=fopen("data.bin","rb");
fseek(fp,sizeof(str_a)*no,SEEK_SET);
fread(&alpha,sizeof(str_a),1,fp);
break;
}
printf("%d\t%d\t%d\n",alpha.a,alpha.b,alpha.c);
fclose(fp);
return 0;
}
上で書いたまんまのソースはいじりまくってしまったので申し訳ないですけど、↑で。
もちろん、同じ状況である事は確認しました。
0748デフォルトの名無しさん
2006/11/26(日) 01:54:52typedef struct
{
int a,b,c;
} str_a;
です。
0749デフォルトの名無しさん
2006/11/26(日) 01:54:54noはゼロじゃなくていきなり 1 から初めてんの?
多分最初のfseek()が失敗してるよ。戻り値をみてみ。
0750デフォルトの名無しさん
2006/11/26(日) 02:02:34期待した動作と違うって事だろうから、エスパー解答
fp=fopen("data.bin","wb");
↓
fp=fopen("data.bin","r+b");
0751デフォルトの名無しさん
2006/11/26(日) 02:04:05no=0とno=1でfseekの戻り値見てみましたが、0でした。
fseekの引数でnoを(no-1)にしてnoを1と2で試してみましたが、やっぱりno=1を読むと0 0 0になってしまいました。
戻り値の意味が間違ってるならごめんなさい。
0752デフォルトの名無しさん
2006/11/26(日) 02:07:130なら成功してますね。
>>750
あっそういう事か。ファイルを上書きして消してしまってるという事ね。
元のファイルを残したいならr+bだな。
0753デフォルトの名無しさん
2006/11/26(日) 02:11:07それで試したら無事表示できました、ありがとうございます!
オープンモード、もう一度勉強しなおしてきます。
>751
わかりづらくて申し訳ありませんでした。
上書きはwbやwb+とはまた別の書き方なんですね…
こんな深夜にお付き合い頂き、ありがとうございました。
0754デフォルトの名無しさん
2006/11/26(日) 10:26:00■ このスレッドは過去ログ倉庫に格納されています