C言語なら俺に聞け(入門篇) Part 29
関数に渡すことが出来ないから成り下がるんじゃないよ
関数云々以前にまず成り下がるの
構成概念をよくしらない人は黙ってなさい
Javaには便利な文字列型があるけどCには無いってのも関係していますか?
VSのように便利・安全なものほど遅いという感じで覚えておけばよかですか?
上記の実行結果:
x * y結果:2
x * y結果:12
x * y結果:30
j++ * j++結果:1
j++ * j++結果:9
j++ * j++結果:25
関数結果:1
関数結果:4
関数結果:9
関数結果:16
関数結果:25
マクロ結果:1
マクロ結果:9
マクロ結果:25
ここで実行結果を見てx * y結果と関数結果は思った通りになりました
j++ * j++結果とマクロ結果が同じであることも思った通りではありました
ですがなぜ1 9 25と一つとばしなのかがわかりません
j++の度にjが1足されるのだとすれば2 12 30となると思うのですが・・・
ご教示ください
インクリメントが行われる。
printf(”j++ * j++結果:%d\n”, (j++) * (j++));
は、 jが1としてステートメントを処理した後に、インクリメントが2回行われる。
次のループでは3としてステートメントを処理した後に、というかんじです。
http://pc11.2ch.net/test/read.cgi/tech/1211198816/992-
/
ここを参考にしたのですが先頭の2バイトに設置されている”BM”が曲者で
ヘッダも14バイトなのでせめて2バイト予備で入れてくれればいいのに・・・
という状況で・・・・
自分のプログラムで使う構造体なら考慮して作りますけどすでにある
共通のフォーマットだとそうもいかなくて無理やりやってるんですよねorz
の作成をして頂けませんか‥‥??
手元にemacsがなく、しかし、答え合わせをしたく思います‥!!
あなたは実引数に配列識別子を指定した場合、
関数に対してポインタに成り下がったものが渡ると思いますか?
それとも、配列の先頭アドレスを指すポインタに変換された後、
そのポインタが指すアドレスが渡ると思いますか?
int i,j;
COLORREF savecolor[XSIZE][YSIZE];
for(i = 0; i < XSIZE; i++){
for(j = 0; j < YSIZE; j++){
savecolor[i][j] = GetPixel(i, j);
}
}
あとはCSV形式にするだけ
C++じゃなくてC言語だと書き換えも可能だけど絶対やらない事
ミリ秒待たせるにはどうしたらいいでしょうか(T_T)
sleepとか色々な綴りもやりました(;_;)
html->nextはHTMLの内容
#define BODY_SIZE 214
/* <>の切り出し */
html->body = (char *)malloc((size + 1) * sizeof(char));
if(html->body == NULL) goto END;
char *tmp;
while(*html->next++ != ‘<’ && *html->next != ”);
for(int len=0; html->next[len] != ”; len++){
if(html->next[len] == ‘>’){
html->body[len] = ”;
break;}
if(len >= size - 1){
size += BODY_SIZE;
tmp = (char *)realloc(html->body,size);
if(tmp != NULL)
html->body = tmp;
else
goto END;}
html->body[len] = html->next[len];
}
HTMLの<>内を取得していくにあたり、動的なヒープ領域が足りなくなれば、
reallocを使って拡張し、また取得していく、という処理なのですが、
コードが複雑になり、非常に読み難いものになってしまい、
これをもっと簡潔には出来ないものでしょうか?
アイヤー。ごめん。strposはphpですた。
Cだとstrstr?
strstrで二点間(<>)の出現場所を計算して
mallocする、ということでしょうか?
ではstrstrを使わない場合で
>>159のreallocの部分を簡潔にするためにはどうすればいいでしょうか?
個別のタグ内容を割り当てる構造体にファイル全体へのポインタを含めて
そこからデータをコピーしてくるってのは正直気色悪い
終了しますか?(Y/N)とか、終了(1)
継続(0)とか、入力をさせる。
んで入力値をscanfで取って判断してるんだけど、
scanfって直前のEnterとか認識不能なコードをストリームに
残しておくとのこと
おかげでバグだらけで困っているのだ…
他にキーボードからの入力を受け取れて不具合の無い関数は無いかな?
初歩くさくてすまんが…
Cの前にPASCALを勉強することはお利口さん
ただし、ハマるとオ××に転落さん
そこにさえ気をつければ、本当はPASCALから入って欲しいのだが
Cの勉強は、PACALを初歩をマスターしてからという奴
Free-PASCAL/Turbo-Delphi/ラザルス(だったけ)
みたいなフリーな処理系がネットで入手可能だし、条件は
恵まれているのだが…
なにせ、良いPASCALの入門書は絶版に近いのがイタい。
やっぱり××ムの影響だろな。
経験は絶対的に必要だが、努力や熟練とは異質の世界だなと最近痛感。
足を洗うヨテイ
Cでは変更不能なポインタ変数というのが無い(C++ではある)から。
仮に実際にそうであっても、変更不能なポインタ変数であるとtmpをコード上で見なすこと
はしないほうがいい。
*(tmp++)とか書けないだろ?だからポインタ変数とまぎわらしい書き方はしないほうがいい。
char配列をchar*型引き数に渡す場合は、(char*)&(tmp[0])とか(char*)&tmpというキャスト
をして値渡し(アドレス値は、ポインタ変数にアサイン可能)する。
キャストは左辺値にも出来ますが何か?
char *p;
void *q;
(char*)q=p;
fgetsした後にsscanfでバラバラにして
フィールド毎にprintfで表示したいんだが
うまくsscanfでバラせてないみたい・・・
AAAAA
BBB
CCCC
こうなって欲しい。
入力ファイル(固定長5、3、4の3フィールドからなる)
AAAAABBBCCCC
分からないところがあったので質問します
・mallocで確保したメモリは、プログラムの終了と同時に解放されることは保証されているのか
・関数内でmallocで確保したメモリは関数が終了しても解放されず、
別の関数から参照できることは保証されているか
両方、正常に動くことは確認できたのですが、あらゆる環境・状態で成り立ちますか?
学科の出席簿作成。
15人分の学生を表示し、入力により内容を変動させる。
表示順番:
出席表
<入力>学生番号0〜14
<入力>曜日番号0〜6
<入力>時限番号0〜3
<入力>出欠番号0〜1
<入力>学生番号0〜14の時に99を入力するとプログラム終了。
誰かこの問題教えてください。
こういうことをやってないかどうか
#include <stdio.h>
void hoge(char *str)
{
str=”STRING”; /* 間違い */
/* こっちが正解
strcpy(str, “STRING”);
*/
}
int main(void)
{
char str[]=”string”;
hoge(str);
puts(str);
return 0;
}
まてそれは大丈夫だろw
落ち着け
for(i=0; i<25; i++) {
j = rand() % (i + 1);
a[i] = a[j];
a[j] = i + 1;
}
こうやるとムダなチェックが必要なくなるよ
商店街のクジ引きなら最後のほうw
マジレスすると、センスないのはお前だ。それは偏る。
<Proof>
N=3とすると、置換の可能性は3^2=27。
一方、3つの要素の並べ方は3!=6。
27/6は整数ではない。故に、偏る。q.e.d.
実際に列[0,1,2]に対して、6万回の試行をしてみると、
[0,1,2]:9063
[0,2,1]:10843
[1,0,2]:11236
[1,2,0]:11121
[2,0,1]:8719
[2,1,0]:9018
この程度のばらつきが出る。
数学的に考えれば、9000前後の数字が出ている列は、
それぞれ並べ替え方27のうち4を占めていて、
11000前後のはそれぞれ27のうち5を占めている。
正確にシャッフルしたければ、並べ替え方が6!のKnuthシャッフルを使うべし。
char str[] = hairetu //暗号化する文字列
int j = 0; //暗号化する文字列の現在位置
strとjが上記の場合
while(*(str+j) != ’’)
このwhileの条件ってどういう意味ですか
なぜ文字列に位置を示す数を加算できるのですか??
http://pc11.2ch.net/test/read.cgi/tech/1211198816/226
はダメですか?N-BASICの昔からよく目にするからくりですが。
#include <stdio.h>
int main(void){
int i;
int goukei, tensu[10];
int max = 0;
int min = 999;
printf(”入力された点数の最高点、最低点、平均点を出力するプログラムです。\n”);
puts(”点数を入力してください。”);
for(i = 0; i < 10; i++){
scanf(”%d”, &tensu[i]);
goukei += tensu[i];
if(tensu > max){
max = tensu[i];
}
else if(tensu < min){
min = tensu[i];
}
}
printf(”最高点数は%d、最低点数は%d、平均は%dです。”, max, min, goukei/10);
}
このような感じで、最高点数と最低点数、平均点を出力するプログラムなのですが、
.\1.cpp(18) : error C2446: ‘>’ : ‘int’ 型から ‘int *’ 型への変換ができません。
整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。
.\1.cpp(18) : error C2040: ‘>’ : ‘int [10]‘ は ‘int’ と間接操作のレベルが異なります。
とエラーがでてしまいます。配列を使わなければコンパイルできるのですが・・エラーの文章を読んでもどうしてなのかがわかりません・・・
どうかご教授くださいです・・・
職場とか、ヘンなサイトとか?
かつて、今はもう時代遅れとなった「固定長の文字列」が使われていたことがあった。
これは、16バイトとか32バイトとかの固定長のフィールドに文字列を書き込んだもので、
それぞれの文字列の長さは最大でもそのフィールドの大きさにしかならないと決まっていた。
そして、フィールドの長さより短いときには、残りをヌル文字が埋めていた。
だから、フィールドに文字列をコピーするときは、あらかじめフィールドを全部ヌル文字で埋めてから、
フィールドの先頭から文字を入れていって、もう文字がなくなったらそこでやめるだけで済んだ。
この仕様の名残がライブラリ関数 strncpy() である。この関数は指定された長さまで文字をコピーし、
文字列の長さが足りないときにだけ、残りをヌル文字で埋める、という一風変わった動作をするが、
これがまさに上で紹介した固定長の文字列を扱うために最適な仕様であった。
そして今でも、そういう古い習慣を引きずってコードを書いているプログラマや、
そういうプログラマに教わったために意味も知らず古い習慣に従っているプログラマがいる。
既に述べたが、今となっては時代遅れであり、やがて消えていくだろう。
もっともそのときにC自体が残っているかどうかは、誰にもわからない。
a == b のような 条件式は成り立った時必ず 1 が返ると思っていいんですか?
苦しんで覚えるC言語っていうサイトの内容を一通り覚えたんだけど
次何やればいい?
#define DB(x)
とすると
DB(fprintf(stderr,”InitSocket\n”));
が
;
になります
等価演算子?の質問なんですが
例えばfor文で、 i <= 10 ってのは10までいったら終わるって事ですよね?
if文だと、 i <= 10 、10以下の条件が満たされると思っていいのでしょうか?
printf(” * “)
って式だと,
* は11個でるんでしょうか? それとも10個で終わるんでしょうか?
最初は ++しないで、下に下がるんですよね?
ご丁寧に大変どうもありがとうございます!
なるほど。s2やらをコピーした直後に表示しているから、壊れて出ないけど、
その後、s3がs2の領域を塗りつぶしちゃってるんですね!!
ポインタ苦手すぎて、メモリ操作とか難しすぎて涙が出ます。。
memsetは不要なんですね。よく分からないけど、みんなやってるので、やってただけなんです。
ポインタだから不要ってことですね。大変助かります。ありがとうございます。
strncpy()という関数を教えてくださり、ありがとうございます!
決まった文字数以外は切り捨ててしまって構わないので、これで確実にできると思います。
大変ありがとうございます!!
Cド初心者で、ポインタ操作が苦手なんですが、トークンの先頭を示すポインタの値を
記憶しておく場合、main()に戻ったときに、その値は消えてしまったりしないんでしょうか??
変数の範囲とポインタ関係とかもよくわかってません・・泣
> そうやって切り出した一群のポインタの値を関数の外に持ち出すには、
> ポインタのポインタ(ポインタの配列)を使う必要があることに注意すること。
これが切ないほどによく分からないので、やはり、配列コピーで、
文字列はここにある!と、安心した状態でやりたいと思います。
大変に助かりました!感謝感激!助言くださった皆様も、どうもありがとうございました!
お返事遅くなり、すみませんでした!!m(_ _)m
「問題が発生したためtest.exeを終了します」って出るんですが
何がいけないんでしょうか?
#include <stdio.h>
int main(void)
{
int array[10];
int i;
for(i=0;i<10;i++){
printf(”%d番目の数を入力してください:”,i+1);
scanf(”%d”,array[i]);
}
for(i=9;i<0;i–){
printf(”%d\n”,array[i]);
}
return 0;
}
voidはmallocで確保した際の戻りアドレスで
nodeは構造体
キャストがうまく出来てない?
教えてください。下記のコードでは、出力される結果はchar型へのポインタの
サイズだと思いますが、メモリで確保した領域を取得する関数などは在りますか?
処理系はcygwin + gcc です。ウェブで検索するとmalloc.hにてmalloc_usable_size
という関数が紹介されていたのですが、私の環境では関数がない様でした。
int main (void){
char *str;
str = malloc(sizeof(char)*10);
printf(”sizeof(str)=%d\n”, sizeof(str));
return 0;
}
また、こういった動的に確保した場合の処理は皆さんはどの様に処理していますか?
やはり、自分でメモリ領域管理変数などを用意するのでしょうか?
int main()
{
int x;
x = 10;
char (*y)[x];
y = malloc(x);
printf(”%d\n”, sizeof(*y));
return 0;
}
そこで今日書店に指南書を探しにいったのですがいまいちどれもとっつきにくく帰ってきました。
プログラムとはそもそも何かという概念的な事から始まり、揃えるべき環境(ツール)が細かく指定されてる超入門書ってないでしょうか?
実際の会社のプログラムとかでもやはり使わないのですか?
void main(void) は常に間違いである。
int main(void) または int main(int argc, char **argv) を使え。)
「規格には反しているが処理系によっては動く」ということを間違いでないと断定することは、
ありとあらゆる規格に反する書き方が間違いでないことになる可能性があることに気付いているか。
文法が正しいか正しくないかは、プログラムが動くか動かないかとは本質的に別の問題である。
文法は守るべきものであり、仮に文法に反することが容認されるとしても、それは正しいからではない。
void main(void)で書き始めるのは間違い。
voidはmainだけにつく引数。
正しくはint main()
ありがとうございます。ついでに中の上のレベル位までで、
プログラムの実力ってどんなもので計られるんですか?関数の暗記量とか。
表示させるプログラム」をswitch文を用いて作成せよ。と言われましても・・・唐突だよ。
続けざまにこんな問題も、「キーボードから数値を1つ入力し、実数か整数か自然数か判定し、
当てはまるものすべてを表示するプログラムを作成しなさい」と。
挙句、「フフ、僕の課題は難しいよ(キッパリ)、君達に解けるなんておもってないけどフフンwww(バンバン)」だって・・・
まるっきりどこぞのAAみたいな人だから困る。
でも解けないのは事実だから困る。上の2題、どうかご教授下さい。
質問し直します
C言語の開発統合環境で初心者におすすめのものはなにがありますか?フリーソフトでお願いします。
C言語の始めよう というものを今まで使っていました。VisualC++2005は難しくて使えませんでした
というか今までのと勝手が違いすぎてなにがなんやら
学校ではVisualstudioC++ みたいなのを使ってるんですがこれはもの凄い使いやすいです
課題は1から100までの素数をすべて求めるプログラムの作成です。
for文を使うのですが、よくわかりませんでした。ご返答よろしくお願いします。ちなみにLinuxで作成しなければいけません。
ありがとうございます。
少し調べてみます。また、わからなかったら来るのでその時はよろしくおねがいします。
例を教えてください。C89でどんな例で困るのかに興味があります。
Post a Comment