プログラムの説明 :
例えば、文字列としてcatと入力すれば1文字ずつ読み込んでcatと表示するプログラムです。for文により、1文字ずつの読み込みを実現しています。
分からない点:
char型で文字列がどのように管理されるのか。また、メモリやアドレス等の内部構造が分かりません。
初めてなので、丸暗記は避けたいので誰か詳しく教えてください。
お願いします。
[C]char型で1文字ずつ読み込む場合
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: [C]char型で1文字ずつ読み込む場合
そうですね。デバッガで見てみるのがひとつの方法です。
あるいは、下記のように表示してみましょう。 ※ インデントを揃えるとプログラムが読みやすくなります。 lineは文字しか格納出来ないので文字列の形では保存されていません。
あるいは、下記のように表示してみましょう。 ※ インデントを揃えるとプログラムが読みやすくなります。 lineは文字しか格納出来ないので文字列の形では保存されていません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
koiroke
Re: [C]char型で1文字ずつ読み込む場合
お返事ありがとうございます。
頂いたプログラムで実行してみたところ以下のようになりました。
3文字の文字列を入力してください: cat
アドレス:00DAFABF 文字:c 16進数0x63
アドレス:00DAFABF 文字:a 16進数0x61
アドレス:00DAFABF 文字:t 16進数0x74
これは宣言した変数lineのアドレスが00DAFABFにあり、そのアドレス内の内容が書き換えられているということであっていますか。
また、文字列を扱う際には、配列を使うのが一般的なようですが、配列の場合だと書き換えは行わず、
個々の内容が個々のアドレス内に格納されていくということなのでしょうか。
無駄なメモリを食わないためには、配列を使わず、今回の例のように変数のアドレスの内容を書き換えた方が有効だという認識で正しいのでしょうか。
あと、見やすいようにインデントは施したつもりだったのですが、できていなかったようなので具体的に何をどうするべきか教えてください。
質問攻めで申し訳ありません。
頂いたプログラムで実行してみたところ以下のようになりました。
3文字の文字列を入力してください: cat
アドレス:00DAFABF 文字:c 16進数0x63
アドレス:00DAFABF 文字:a 16進数0x61
アドレス:00DAFABF 文字:t 16進数0x74
これは宣言した変数lineのアドレスが00DAFABFにあり、そのアドレス内の内容が書き換えられているということであっていますか。
また、文字列を扱う際には、配列を使うのが一般的なようですが、配列の場合だと書き換えは行わず、
個々の内容が個々のアドレス内に格納されていくということなのでしょうか。
無駄なメモリを食わないためには、配列を使わず、今回の例のように変数のアドレスの内容を書き換えた方が有効だという認識で正しいのでしょうか。
あと、見やすいようにインデントは施したつもりだったのですが、できていなかったようなので具体的に何をどうするべきか教えてください。
質問攻めで申し訳ありません。
Re: [C]char型で1文字ずつ読み込む場合
多分正しいと思います。koiroke さんが書きました:また、文字列を扱う際には、配列を使うのが一般的なようですが、配列の場合だと書き換えは行わず、
個々の内容が個々のアドレス内に格納されていくということなのでしょうか。
無駄なメモリを食わないためには、配列を使わず、今回の例のように変数のアドレスの内容を書き換えた方が有効だという認識で正しいのでしょうか。
ただ、何をしたいかによって配列に読み込む方がいいか、1文字ずつ読み込む方がいいかは変わります。
基本的には、{の次の行は前の行({がある行)より1段階インデントを増やす、}がある行は前の行より1段階インデントを減らす、でしょうか。koiroke さんが書きました:あと、見やすいようにインデントは施したつもりだったのですが、できていなかったようなので具体的に何をどうするべきか教えてください。
その他の例(これは自己流です)
int hoge(void) {
int a=0;
if(a==0 || a==1 || a==2 || a==3 || a==4 || a==5 || a==6 || a==7)
do_func1(); /* {なしのif文の次の行に処理を書くときは1段階増やす */
a++;
if(a==0 || a==1 || a==2 || a==3 || a==4 || a==5 || a==6 || a==7 ||
a==8 || a==9 || a==10 || a==11) {
/* ifの条件を改行するときは、2段階増やして中身のインデントと揃わないようにする */
do_func2();
}
switch(a) {
case 1:
fuga(1);
break;
case 2:
fuga(2);
break;
default:
fuga(0);
break;
}
}複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
-
koiroke
Re: [C]char型で1文字ずつ読み込む場合
御親切にありがとうございます。多分理解できたと思います。
インデントのやり方はみけさんのやり方で慣れられるように日ごろから意識するようにします。
お世話になりました。
インデントのやり方はみけさんのやり方で慣れられるように日ごろから意識するようにします。
お世話になりました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: [C]char型で1文字ずつ読み込む場合
解決してますが無駄なメモリを考えるよりも、無駄な処理にならないかを考えたほうが建設的です。
メモリサイズがざっと計算して100MBを超えるようになら一考の余地ありですが、10MB未満ではごちゃごちゃ考えてもソートや検索以外では労力の割に合わないとおもいます。
メモリサイズがざっと計算して100MBを超えるようになら一考の余地ありですが、10MB未満ではごちゃごちゃ考えてもソートや検索以外では労力の割に合わないとおもいます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
koiroke
Re: [C]char型で1文字ずつ読み込む場合
>>無駄なメモリを考えるよりも、無駄な処理にならないかを考えたほうが建設的です。
わかりました。メモリに囚われすぎず、見やすくて効率的な処理に意識するよう心がけます。
わざわざありがとうございます。
わかりました。メモリに囚われすぎず、見やすくて効率的な処理に意識するよう心がけます。
わざわざありがとうございます。