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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
koiroke

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

#1

投稿記事 by koiroke » 12年前

プログラムの説明 :
例えば、文字列として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 ;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 12年前

そうですね。デバッガで見てみるのがひとつの方法です。
あるいは、下記のように表示してみましょう。 ※ インデントを揃えるとプログラムが読みやすくなります。

コード:

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は文字しか格納出来ないので文字列の形では保存されていません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

koiroke

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

#3

投稿記事 by koiroke » 12年前

お返事ありがとうございます。
頂いたプログラムで実行してみたところ以下のようになりました。

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

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

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

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

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#4

投稿記事 by みけCAT » 12年前

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;
    }
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

koiroke

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

#5

投稿記事 by koiroke » 12年前

御親切にありがとうございます。多分理解できたと思います。
インデントのやり方はみけさんのやり方で慣れられるように日ごろから意識するようにします。

お世話になりました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 12年前

解決してますが無駄なメモリを考えるよりも、無駄な処理にならないかを考えたほうが建設的です。
メモリサイズがざっと計算して100MBを超えるようになら一考の余地ありですが、10MB未満ではごちゃごちゃ考えてもソートや検索以外では労力の割に合わないとおもいます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

koiroke

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

#7

投稿記事 by koiroke » 12年前

>>無駄なメモリを考えるよりも、無駄な処理にならないかを考えたほうが建設的です。

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

閉鎖

“C言語何でも質問掲示板” へ戻る