ページ 11

[C]char型で1文字ずつ読み込む場合

Posted: 2013年8月13日(火) 11:35
by koiroke
プログラムの説明 :
例えば、文字列としてcatと入力すれば1文字ずつ読み込んでcatと表示するプログラムです。for文により、1文字ずつの読み込みを実現しています。
分からない点:
char型で文字列がどのように管理されるのか。また、メモリやアドレス等の内部構造が分かりません。
初めてなので、丸暗記は避けたいので誰か詳しく教えてください。
お願いします。

コード:

#include<stdio.h>
int main ()
{
	char line;
	printf("3文字の文字列を入力してください: ");
	
	for(int i=1;i<=3;i++){
	scanf("%c",&line);
	printf("%c",line);
	}
	printf("\n");
	return 0 ;
}

Re: [C]char型で1文字ずつ読み込む場合

Posted: 2013年8月13日(火) 12:41
by softya(ソフト屋)
そうですね。デバッガで見てみるのがひとつの方法です。
あるいは、下記のように表示してみましょう。 ※ インデントを揃えるとプログラムが読みやすくなります。

コード:

include<stdio.h>
int main () {
	char line;
	int i;
	printf( "3文字の文字列を入力してください: " );
	for( i = 1; i <= 3; i++ ) {
		scanf( "%c", &line );
		printf("アドレス:%p 文字:%c 16進数0x%02x\n",&line,line,line);
	}
	printf( "\n" );
	return 0 ;
}
lineは文字しか格納出来ないので文字列の形では保存されていません。

Re: [C]char型で1文字ずつ読み込む場合

Posted: 2013年8月13日(火) 14:27
by koiroke
お返事ありがとうございます。
頂いたプログラムで実行してみたところ以下のようになりました。

3文字の文字列を入力してください: cat
アドレス:00DAFABF 文字:c 16進数0x63
アドレス:00DAFABF 文字:a 16進数0x61
アドレス:00DAFABF 文字:t 16進数0x74

これは宣言した変数lineのアドレスが00DAFABFにあり、そのアドレス内の内容が書き換えられているということであっていますか。
また、文字列を扱う際には、配列を使うのが一般的なようですが、配列の場合だと書き換えは行わず、
個々の内容が個々のアドレス内に格納されていくということなのでしょうか。
無駄なメモリを食わないためには、配列を使わず、今回の例のように変数のアドレスの内容を書き換えた方が有効だという認識で正しいのでしょうか。

あと、見やすいようにインデントは施したつもりだったのですが、できていなかったようなので具体的に何をどうするべきか教えてください。

質問攻めで申し訳ありません。

Re: [C]char型で1文字ずつ読み込む場合

Posted: 2013年8月13日(火) 14:48
by みけCAT
koiroke さんが書きました:また、文字列を扱う際には、配列を使うのが一般的なようですが、配列の場合だと書き換えは行わず、
個々の内容が個々のアドレス内に格納されていくということなのでしょうか。
無駄なメモリを食わないためには、配列を使わず、今回の例のように変数のアドレスの内容を書き換えた方が有効だという認識で正しいのでしょうか。
多分正しいと思います。
ただ、何をしたいかによって配列に読み込む方がいいか、1文字ずつ読み込む方がいいかは変わります。
koiroke さんが書きました:あと、見やすいようにインデントは施したつもりだったのですが、できていなかったようなので具体的に何をどうするべきか教えてください。
基本的には、{の次の行は前の行({がある行)より1段階インデントを増やす、}がある行は前の行より1段階インデントを減らす、でしょうか。
その他の例(これは自己流です)

コード:

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;
    }
}

Re: [C]char型で1文字ずつ読み込む場合

Posted: 2013年8月13日(火) 14:55
by koiroke
御親切にありがとうございます。多分理解できたと思います。
インデントのやり方はみけさんのやり方で慣れられるように日ごろから意識するようにします。

お世話になりました。

Re: [C]char型で1文字ずつ読み込む場合

Posted: 2013年8月13日(火) 18:09
by softya(ソフト屋)
解決してますが無駄なメモリを考えるよりも、無駄な処理にならないかを考えたほうが建設的です。
メモリサイズがざっと計算して100MBを超えるようになら一考の余地ありですが、10MB未満ではごちゃごちゃ考えてもソートや検索以外では労力の割に合わないとおもいます。

Re: [C]char型で1文字ずつ読み込む場合

Posted: 2013年8月14日(水) 07:59
by koiroke
>>無駄なメモリを考えるよりも、無駄な処理にならないかを考えたほうが建設的です。

わかりました。メモリに囚われすぎず、見やすくて効率的な処理に意識するよう心がけます。
わざわざありがとうございます。