-char型の変数の扱いで悩んでいます。関係について入力中の回答があります。ページを離れますか?※ページを離れると、回答が消えてしまいますページを離れるA回答を続ける入力中のお礼があります。23:17回答数:5件char型の変数の扱いで悩んでいます。具体的には以下の二つのプログラムの差異についてです。&c);-----------------------上のプログラムは正しいと思うのですが、下のプログラムが正しいのかどうか、わかる方に教えていただきたいと思い質問させていただきました。どちらのプログラムも問題なく動作します。関数については間違った使い方なのではないかと思っています。入力された文字のうち、終端文字の手前までの文字を引数のポインタが示すオブジェクトへ順に格納していく関数だと理解しているので、入力された文字が一文字だった場合、&cの示すオブジェクトに文字が代入されると考えたからです。&cの示すオブジェクトから”ヌル文字”の手前までの文字列を順に表示する関数だと理解しているので、問題なく動作しているのは&cで示されるオブジェクトの後ろの領域が偶然'\0'だったからではないかと考えたからです。何かの本で、未使用の領域は0である確率が高いという記述をみたことがあり、'\0'は0と同じだということなので問題なく動作する率が高いのではないかと思っています。僕の考え方がどの程度正しくて、正確にはどうなのかを教えて欲しいです。改行文字が代入されてしまいます。空白文字が代入されます。"と最後に空白を入れても次のstr2が空白で始まることはありません。この辺りの処理がどのような法則で実行されているのかが分かりづらくて悩んでいます。str);の場合には最初の文字が空白や改行文字でも、その次に有効な文字があればそれらの改行や空白を無視するのではないかと思っています。分かる方がいましたら回答をよろしくお願いします。通報するこの質問への回答は締め切られました。漢字」に関するQ&A:きれいな漢字の見本が見れるサイトを紹介してください。1文字分の領域しか確保されていないので、1文字以上の文字列を無理矢理格納すると他のデータが存在しているかもしれない領域を書き換えてしまいます。(メモリ破壊)なお、'\0'はscanfが(本来書き込んではいけない領域に対してですが)書き込んでいます。改行文字が代入されてしまいます。最初のscanfが改行文字を読み込んでいないからです。以下のページに書かれている内容と本質的には同じ。最初の文字が空白や改行文字でも、その次に有効な文字があればそれらの改行や空白を無視するのではないかと思っています。考えて問題ないと思います。回答ありがとうございます。記載していただいたURLも非常に参考になりました。間違っているわけではありません。char型は「int型やlong型よりも狭い範囲の整数」を扱う型で、scanf()で標準入力から受け取った値を"%c"という書式文字列で受け取り、-128~+127または0~255の範囲のいずれかの値をとる、という状況はあっておかしくないです。回答ありがとうございます。正しいコードについて解説していただけて、参考になりました。12:31いろいろと回答が出ていますが、一応。c);-----------------------これはscanfの「指定した文字だけを読み込む」という仕様から正しいプログラムです。文字は文字列でないため、'\0'はありません。Enterなどで入力された改行文字が入力ストリームに残ります。&c);-----------------------これは文字列を読み込む時、領域の無い部分へ書き込みを行うため誤ったプログラムです。>何かの本で、未使用の領域は0である確率が高いという記述を>みたことがあり、'\0'は0と同じだということなので>問題なく動作する率が高いのではないかと思っています。そもそも、確率なんていってる時点でダメダメですね。スタティック変数などは定義された時初期化が保障されていますが、ローカル変数などは初期化保障されていません。改行文字が代入されてしまいます。上で書いたように、指定されず読み込まれなかったものは、Enterなどで入力された改行文字が標準入力に残ります。空白文字が代入されます。"と最後に空白を入れても>次のstr2が空白で始まることはありません。これは上で少し述べましたが、矛盾した入力文字は読まれないまま入力ストリーム上に残り入力中で後続し(改行文字を含む)空白類は、指令に照合しない限り読み込まれないまま残る。いうscanfの指定子集合の仕様のためです。scanfは多くの場合、バッファオーバーフローを起こすと言われますが、入力文字数の制限などは可能です。詳細な回答ありがとうございます。入力ストリームという概念とscanf関数の知識が足りなかったのだと分かりました。これからの学習に役立てていこうと思います。&c);誤----------------------------例に上げられている後のプログラムは間違いです。正しく動いているように見えるだけです。%sはNull終了の文字列を扱うので、通常は以下のように書きます。str);正----------------------------なお、scanfは、本当に「ちょっとお試しで入力」という「お勉強用」関数と考えたほうがいいですね。バッファオーバーフロー攻撃ってのもありますし。質問者さんは、不可解な動作で悩まれていますが、その問題の原因が判ったとしても、使いにくいのは変わらないと思います。私は深く追求していません。scanf関数は通常は使いませんので。その手の入力が必要な場合は、fgetsなどの1行単位で文字列入力を受け取ったあとに、sscanfで入力された文字列から、個々のデータを切り出すやり方を使っています。このほうがエラー検出も容易だし、使いやすいからです。それから、蛇足ですが・・・.C言語で、それなりに、まともに使える入力ルーチンを作ると、カーソル処理とか漢字対応や編集処理なども含めて、いろんな知識が必要で、コードも500行以上になる可能性があります。最近はフォーム画面を使うので、画面処理もある意味で楽なんですが、エスケープコードを使ってCUI画面で入力処理するプログラムを作ると、結構勉強になります。参考になる書籍が無い気がします。linuxのGNUライブラリにある1行入力ルーチン(たぶんあると思う)が見本になると思います。回答ありがとうございます。入出力についてはもっと勉強したいので、GNUライブラリも当たってみたいと思います。関数については間違った使い方なのではないかと思っています。どちらも間違っています。1文字入力して、Enterキーで確定したとしても、最低でもchar型の配列が必要です。charで2つは必要。「文字列」ですから、'\0'も書き込みます。ちなみに、このままでは何百文字だろうと入力可能です。その後の動作は保証できませんが。何かの本で、未使用の領域は0である確率が高いという記述をみたことがあり、'\0'は0と同じだということなので問題なく動作する率が高いのではないかと思っています。そんな保証はないかと思いますが...Cの規格書読んだわけではないので断言しかねますけど。この辺りの処理がどのような法則で実行されているのかが分かりづらくて悩んでいます。場合には最初の文字が空白や改行文字でも、その次に有効な文字があればそれらの改行や空白を無視するのではないかと思っています。標準ライブラリの仕様書を確認する必要があるかと思いますが..."%s"がホワイトスペース(半角空白、水平タブ、改行)を読み飛ばす仕様になっているからではないかと。回答ありがとうございます。暇を見つけて自分の使う関数の仕様は確認してみようと思います。漢字」に関するQ&A:私は元在日韓国人です。変換指定%sについてです。いうエラーC言語・C++・C#7エクセルで計算すると2.43E-19などと表示される。Me・NT・20008「memcpy」と「strcpy」についてC言語・C++・C#9複数桁10進数の*桁目だけを抽出したいC言語・C++・C#10Enterキーを押されたら次の処理に移るという事をしたい。変換指定%sについてです。いうエラーC言語・C++・C#7エクセルで計算すると2.43E-19などと表示される。Me・NT・20008「memcpy」と「strcpy」についてC言語・C++・C#9複数桁10進数の*桁目だけを抽出したいC言語・C++・C#10Enterキーを押されたら次の処理に移るという事をしたい。C,C++のsizeof演算子の仕様について。回答数ランキングです。変換指定%sについてです。現場での経験もあるPGなのですが、C言語の基礎を復習していたら疑問に思うことが出てきてしまったので、質問させて下さい。pointer);とした場合に、"test"と表示されるのがイマイチ納得できないんです。*pointer);としなければならないわけで、そういうことをいろいろ考えていたら、収拾がつかなくなってしまって(^_^;)「とにかく%sはそういうものなの!!」と丸暗記すれば困るようなことはないのですが、どうにもモヤモヤしっぱなしなので、%sの動きについて詳しくお分かりの方がいらっしゃいましたら、ご教授下さい。お願いしますm(__)m現場での経験もあるPGなのですが、C言語の基礎を復習していたら疑問に思うことが出てきてしまったので、質問させて下さい。pointer);とした場合に、"test"と表示されるのがイマイチ納得できないんです。pri...続きを読むAベストアンサーC言語の規格上では。精度を超える書き込みは行わない。精度が指定されない場合、または精度が配列より大きい場合その配列はナル文字を含まなければならないとされています。配列より小さい精度が指定されなければ受け取ったポインタを文字配列の先頭要素とし\0が出てくるまで表示します。結果も大文字で表示されますよね。no);他の回答も見るQfloat型とdouble型の変数の違いを教えてほしいですfloat型とdouble型の変数の違いを教えてほしいです2Dゲームを作っててdoubleの変数を使ってたんですが使ってはだめだと先輩に言われたんです。理由を聞いたら、先生が「doubleは使わないほうがいい」と言われたらしくてちゃんとした理由がわかりませんでした。それを知って何をするということではないんですが、気になって調べても出てこなかったので質問させてください。ゲーム作りを始めたばっかりでぜんぜん詳しくないですが教えてくれたら助かります。Aベストアンサーdoubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。一般的には、桁が多いとその分計算時間がかかります。精度が必要ない場面では、floatを使う、というのも一つの考えかたです。実際には「一概に言えない、処理系依存」です。以前は全てCPUで計算していたので、精度=計算量でした。回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速にできたり、と様々です。32bitCPUでは、32bitのfloatの方が扱いやすいでしょうが、64bitCPUでは64bitのdoubleの方が扱いやすいかもしれません。Cのmath.hで使える標準関数はdouble型のものがほとんどです。三角関数は2Dのゲームでも使う機会が多いのではないでしょうか。sinもcosもdouble型です。内部演算は当然doubleですので、変数にfloatを使ったからと早くはならず、むしろfloat型の変数に入れるときに暗黙の型変換が発生する分遅くなる可能性もあります。いった背景を考え検討した結果、floatを使う方がよい、と判断したのならいいのですが、「先生に言われた」では理由になりません。聞けるのなら、その先生に理由を聞いてください。真意がわからないうちは、鵜呑みしないことです。doubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。一般的には、桁が多いとその分計算時間がかかります。精度が必要ない場面では、floatを使う、というのも一つの考えかたです。実際には「一概に言えない、処理系依存」です。以前は全てCPUで計算していたので、精度=計算量でした。回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速...続きを読む他の回答も見るQバッファとは何ですかC言語を使用してるとバッファという言葉がよく出てきますがバッファとは何ですかメモリとは違うものですか訳をみても緩衝材とか一時的に蓄える場所という意味でよく分かりません一時的でない使い方も多い気がしますが実際はどういうものですかAベストアンサー#1です寝ぼけて適当に書いたので修正。見つけることができたもので正確なものは英語版ですがこちらくらいかも。(en.)http://en.wikipedia.org/wiki/Data_buffer一応簡単なものはこちらです。e-Wrodshttp://e-words.jp/w/E38390E38383E38395E382A1.html「複数の機器やソフトウェアの間でデータをやり取りするときに、処理速度や転送速度の差を補うためにデータを一時的に保存しておく記憶装置や記憶領域のこと。差のための緩衝材的な意味です。昔はソフトウェアとハードウェア間に使うデータでソフトウェア側がデータを受け取るか、整形して送信するときに使うメモリ領域が基本的にバッファでした。マルチプロセッサ・マルチタスクの時代になってくると、ソフトウェア間の処理速度の違いを吸収するために使うメモリ領域にもバッファという言葉が使われるようになりました。ソフトウェア間で逐次(FIFO)処理されるデータのためのメモリ領域がこちらの使われ方の主戦場といったところでしょうか。ソフトウェア間でただ一括転送されるデータならバッファという言葉は誤用ということになるのですが、よく誤用されます。#1です寝ぼけて適当に書いたので修正。見つけることができたもので正確なものは英語版ですがこちらくらいかも。(en.)http://en.wikipedia.org/wiki/Data_buffer一応簡単なものはこちらです。e-Wrodshttp://e-words.jp/w/E38390E38383E38395E382A1.html「複数の機器やソフトウェアの間でデータをやり取りするときに、処理速度や転送速度の差を補うためにデータを一時的に保存しておく記憶装置や記憶領域のこと。...続きを読む他の回答も見るQEnterキーを押されたら次の処理に移るという事をしたい。ここに処理を書く}という関数が必要なようです。他の回答も見るQc言語のポインタへの文字列入力についてです。ように配列に変えるとうまくいくことはなんとかわかるのですが・・・助けてください(^_^;)Aベストアンサーポインターというのは格納された値のアドレスのメモリーを指すための変数です。配列はデータを格納するためのメモリーを確保して、その先頭のアドレスが入っていますよ。a);と書くと、aを初期化せずにaの指す先にscanfで文字列を入れます。プログラムが書き込むことを許されていないメモリーに書き込みを行おうとしたことを検出したOSからそのプログラムは強制終了されます。a);となっているとどうなるか。aは"aaaaa"が格納されているメモリーを指すように初期化されます。"aaaaa"は固定値を入れるために書き込みができないメモリーに格納されています。a);も書き込みができないところに書こうとしたことをOSに検出され、強制終了となります。2つ方向があると思います。a[128];のように宣言し、スタック上にメモリーを確保し、その先頭アドレスが入っているaを渡す方法。mallocなどでヒープにメモリーを確保する方法。a[128];で配列を確保しているので書き込みを行うことができ、強制終了はされません。a);free(a);のように書きます。配列はスタック上に取られ、スタック上に取った値はプログラムがその関数を抜けるときに自動的に解放されますが、mallocで確保したメモリーは自動で解放されないので自分でfreeを呼んで開放する必要があります。%127sがそろそろ気になっていると思います。やって127文字までしか受け取らないようにscanfに指示しています。C言語では文字列の最後は終了を示すNUL文字が入るので、確保したメモリーよりも1少ない値となっています。いうわけで、ちゃんとメモリーを確保してからscanfで書き込みましょう。ポインターはあくまでどこかのメモリーアドレスを指すだけで、指した先がちゃんと確保されているかどうかは知りませんから。ポインターというのは格納された値のアドレスのメモリーを指すための変数です。配列はデータを格納するためのメモリーを確保して、その先頭のアドレスが入っていますよ。a);と書くと、aを初期化せずにaの指す先にscanfで文字列を入れます。プログラムが書き込むことを許されていないメモリーに書き込みを行おうとしたことを検出したOSからそのプログラムは強制終了されます。a);となっているとどうなるか。aは"aaaaa"が格納されている...続きを読む他の回答も見るQfgetsなどのときのstdinのバッファを消すには?こんにちは,今C(C++でない)を使用しています。str[20]fgets(str,sizeof(str),stdin)としたときに20字以上を打つと,stdinのバッファに20字以上の分が残ったままになります。C++などではfflush(stdin)で,うまくいきますが,普通のCでは対応がされていないみたいでうまくいきません。);}でいいんだ.失礼しました.他の回答も見るQ「memcpy」と「strcpy」についてC言語の初心者です。先日、課題として以下のようなことを言われました。「memcpyとstrcpyについて、メモリ破壊が起こるとしたらどんな場合が考えられるか、簡単にまとめて報告してみて下さい。私にはメモリ破壊というニュアンスが分からないのですが、どちらの関数も必要以上にコピーを行ったときに起こるメモリ破壊ということなのでしょうか?それとも、何か特別な意味があるのでしょうか?C言語に詳しい方がいましたら、是非、教えて下さい。Aベストアンサーメモリ破壊とは、「当然そこに入っているべき値」を、不用意に上書きしてしまうことです。いう宣言をしたとします。後ろの未定メモリ100バイトを上書きしてしまいます。この未定メモリには、もしかしたら別の変数があるかもしれませんし、プログラムの一部があるかもしれません。OSのシステム領域かもしれません。プログラムは正常に動かなくなります。通常はメモリエラーが出て停止しますが、最悪の場合、メモリ上のOSを破壊してリセットするしかなくなったりもします。これがメモリ破壊です。関係について10個出力で改行したいのですが...プログラミング言語Cとプログラ...4C++でのCRLFについて5MacOSXのgccのprintfで改行が出...6ファイル出力で改行を入れたい!7cout関数を使っているのですが...8csvファイルの横方向への改行に...9fscanf関数について10fgetsで拾われる改行文字を削除...11意味のよく分らないソース12Cでファイルの行数をカウントす...13ButtonコントロールのText14改行までの一文字ずつのファイ...15プログラムのコピー&ペースト...16putsとputcharの違い?17c言語についての問題です。Inc.Q質問する(無料)Q&A検索goo検索gooIDで新規登録・ログイン新規登録する(無料)会員の方はこちら外部サービスのアカウントで新規登録・ログインYahoo!で新規登録・ログインGoogleで新規登録・ログインTwitterで新規登録・ログインFacebookで新規登録・ログインdアカウントで新規登録・ログイン※各種外部サービスのアカウントをお持ちの方はこちらから簡単に登録できます。お客様の許可なしに外部サービスに投稿することはございませんのでご安心ください。会員でない方、会員になるとあなたも質問や回答ができるようになります!!親切・丁寧な回答が集まる場30分以内に回答がもらえ回答数は平均3件!匿名(ニックネーム)での投稿なので。