ページ 1 / 1
年末からC言語を始めました
Posted: 2016年1月06日(水) 11:19
by Field Bloom
初めまして。C言語フォーラムの皆さま
年末からC言語を始めたField Bloomと申します。
とても頭の悪い質問をしてると思うんですが恥を忍んで質問させてください。
小学生の頃からプログラムを組んでいた主人(お師匠さん)のやってる事が楽しそうで、何とか私も覚えたいと思って始めてみました
主人はお師匠さんでしたが、年末年始にしか教わる機会がなく(そして主人もまた自分のプログラムが忙しそう)
ずっと自力で頑張ってきましたがどうしてもcharの概念が理解できません。
全ての文は何も見ないで書けるようになるまで何十回も書いて覚えて頑張ってきましたが、
printfで済むような事をなぜcharでやらなければならないのか理解できません
どうかお勧めのサイトとかございましたら、そう言った情報でもいいので教えて頂きたいです
Cを始めてまだ2週間程度です。どうかよろしくお願い致します(他の言語などは一切やった事がありません)
Re: 年末からC言語を始めました
Posted: 2016年1月06日(水) 11:33
by Rittai_3D
初めまして。Rittai_3Dと申します。
Field Bloom さんが書きました:printfで済むような事をなぜcharでやらなければならないのか理解できません
Field Bloom さんが書きました:全ての文は何も見ないで書けるようになるまで何十回も書いて覚えて頑張ってきましたが、
この文章なのですが、意味が分からないです。何をcharでやるのか、また全ての文が何なのかが分かりません。
Field Bloom さんが書きました:charの概念が理解できません。
http://e-words.jp/w/char%E5%9E%8B.htmlここが参考になりませんか?
ちなみに、「char 意味」で調べたら2つ目に出てきました。
Re: 年末からC言語を始めました
Posted: 2016年1月06日(水) 11:40
by Field Bloom
3Dさんご回答ありがとうございます。
私の今の認識ですと、文字列をcharで表示するという認識なのですが
printfでABCDE を表示するのと
charにABCDEを代入して表示する意味が解らず・・・といった所で
多分正しく理解していないと思います
文字の集まりならばprintfで出力できるのではないかと思ってしまって
あっ。全ての文というのはchar以外のサンプルプログラムです。
if文などはサンプルプログラムを見ないで書けるようにはしたんですが
Re: 年末からC言語を始めました
Posted: 2016年1月06日(水) 12:39
by みけCAT
Field Bloom さんが書きました:私の今の認識ですと、文字列をcharで表示するという認識なのですが
文字列はchar型の変数には入りませんし、普通はcharで表示(?)はできない気がします。
Field Bloom さんが書きました:printfでABCDE を表示するのと
charにABCDEを代入して表示する意味が解らず・・・といった所で
char型の変数は1文字しか入らないので、普通はABCDEは代入できないか、代入すると一部のデータが消えます。(「ABCDE」がchar型の変数なら別ですが)
「charにABCDEを代入して表示する」サンプルコードを提示していただけますか?
オフトピック
リンカスクリプト(?)やnasmで出力に使用するメモリマップドな出力ポートやVRAMの要素をchar型の「変数」に割り当て、そこに代入することで出力や表示をすることはできる…?
Re: 年末からC言語を始めました
Posted: 2016年1月06日(水) 13:25
by Field Bloom
いっぱいいっぱいだったので、ご挨拶忘れてましたみけさん丁寧なご検討有難うございます
シングルクォートで囲んだchar mojiretu[5] = {'A','B','C','0'};を始めに覚えました
[5]と指定したのに5以上いれるとオーバーフローする事もわかっています
その次にstrcopyを使った文字列これを代入と呼ぶのでしょうか?
こういうcharを覚えたのですが
#include <stdio.h>
#include <string.h>
int main(void)
{
char mojiretu[10];
strcpy(mojiretu, "ABCDE");
printf("%s\n", mojiretu);
return 0;
}
問題はこれをする事でどんなプログラムに使われるのかがわかりません
それと
>
オフトピック
リンカスクリプト(?)やnasmで出力に使用するメモリマップドな出力ポートやVRAMの要素をchar型の「変数」に割り当て、
>そこに代入することで出力や表示をすることはできる…?
[/quote]
等はまだ全く分からない状態です・・・リンカスクリプトやVRAMは今現在C言語講座サイトには出てきていません
Re: 年末からC言語を始めました
Posted: 2016年1月06日(水) 14:28
by softya(ソフト屋)
ざっくり説明するとchar配列に文字列は格納できますが、これは文字列加工やループ処理、複雑な表示処理において便利だからです。
簡単なプログラムの場合は特に役に立つわけではないですので、将来的には必要なので勉強すると考えていただくしか無いと思います。
あと覚えるというより理解すると言ったほうがしっくりするのがプログラミン言語の学習ですので、なんでも覚えると思っていただかないほうが良いかと思います。
>その次にstrcopyを使った文字列これを代入と呼ぶのでしょうか?
copy(複製)ですね。関数名もcopyと書かれています。
広い意味では代入といえると思います。
>問題はこれをする事でどんなプログラムに使われるのかがわかりません
strcatと組みあせて文字列を結合するとかで使われます。
現状だと固定文字列ですが、scanfで入力とかファイルから入力とかどんどん使い方の幅が広がります。
Re: 年末からC言語を始めました
Posted: 2016年1月06日(水) 14:59
by Field Bloom
ソフト屋さん ご回答感謝致します
ふむふむ今後While等にも使われるのでしょうか。
わからないまま進むのが嫌で、今までの過程まではわかるまでいろんなサイトを徘徊しました
(While、for,if,else.等)
それらのソースの書き方、条件式は覚えるまで書き、
サイトを見ずとも自分で簡単なアレンジを加えてかけるかどうかも試してきました
ですが簡単なサンプルプログラミングのみなので、複雑な事はまだできない気がします。
私も皆さんのご回答を拝見しながら色んなサイトを徘徊し、漠然とは理解したような気もするのですが、
このまま進んでよいものかどうかといった所です
strcatは次の項目に書いてありました。色々試しながらまた戻って繰り返してをしながら
理解を深めていくのが良いのかなと思っております
とても勇気の出るご回答をありがとうございました!覚えるより理解を深める、その通りですね!
頑張ります!
Re: 年末からC言語を始めました
Posted: 2016年1月06日(水) 16:31
by sleep
Field Bloom さんが書きました:
printfで済むような事をなぜcharでやらなければならないのか理解できません
まず、printfに渡す文字列は データが char型であることは疎か、配列である必要すらありません。
printfの方から データは char型のアドレスで渡してもらえるように構文上でこちらに要求しているだけです。
以下を見てください。(注:Intelなどリトルエンディアンを扱うCPUを前提としたコードです)
コード:
#include <stdio.h>
#include <string.h>
int main()
{
int a = 0;
a = 'a';
printf("%c\n", a); // a
a = 66;
printf("%s\n", (char*)&a); // B
strcpy((char*)&a, "abc");
printf("%s\n", (char*)&a); // abc
}
int型でも、自分のアドレスを渡してやれば printfは %c なら文字 %s なら 文字列として表示してくれます。
「char型のアドレスが渡されている、渡されていない」という判定は、コンパイラが構文上でチェックしているだけです。
つまり、コンパイラが許せば以下でも同じ実行結果が得られます。
コード:
#include <stdio.h>
#include <string.h>
int main()
{
int a = 0;
a = 'a';
printf("%c\n", a); // a
a = 66;
printf("%s\n", &a); // B
strcpy(&a, "abc");
printf("%s\n", &a); // abc
}
printfはデータを表示するとき「文字列として表示してほしいと頼まれた場合は、\0を表す1バイトの値が出現するまで渡されたデータを文字列として画面に表示すれば良いんだろう? 楽勝だわー」ということしか考えてません。
要は、printfはあまり利口ではありません。
つまり、char で渡すというのは、「変数」で渡すということを意味しています。
逆に "ABCDE" で渡すというのは、「定数」で渡すということを意味しています。
なので、Field Bloomさんが抱えている疑問は「なぜ「定数」で事足りるのに「変数」でやる必要があるのか?」ということになります。
「変数」と「定数」については、以下の参考サイトをみてみるとなんとなく分かるかもしれません。
データの扱い
標準入出力関数(1)
疑問を
「printfで済むような事をなぜcharでやらなければならないのか」
から
「「変数」と「定数」でそれぞれできること、できないこと」
にテーマを変えて考え始めてみると解決の糸口が見つかるかもしれません。
Re: 年末からC言語を始めました
Posted: 2016年1月06日(水) 16:50
by sleep
sleep さんが書きました:
int型でも、自分のアドレスを渡してやれば printfは %c なら文字 %s なら 文字列として表示してくれます。
訂正: int型でも、printfは %c なら文字、%s なら(自分のアドレスを渡してやれば)文字列として表示してくれます。
Re: 年末からC言語を始めました
Posted: 2016年1月06日(水) 17:01
by Field Bloom
Sleepさん…凄く丁寧な回答にびっくりしております…!
わからない単語が多々書いてありますが、(ポインタ、アドレスはまだ出てきていなかったんです)
単語を全て調べて理解に挑んでみています
私の疑問点を全てまとめてくださって本当に感謝してます…!
そうです!こう言う事が言いたかったのです!
こんな風に私の疑問を正確に理解して下さる方がいるとはびっくりです
どう伝えればよいのか困っておりました
紹介されたサイトじっくり読んでみたいと思います!本当に本当にありがとうございました!
頑張って理解に挑みます!
Re: 年末からC言語を始めました
Posted: 2016年1月06日(水) 17:50
by Dixq (管理人)
お勧めの本は?と言われたらいつもこれを紹介している本です。
これは入門編ですが、実践編もありますので、入門編が読み終わったら実践編を読んでみてください。
しかし旦那さんは普段教えてくれないんですか?
夫婦なら旦那に聞くのが一番早い気が・・。
オフトピック
私なら嫁がプログラム勉強したいと言ってくれるなら朝から晩まで教えるのに・・。(勉強してくれない
Re: 年末からC言語を始めました
Posted: 2016年1月06日(水) 18:04
by Field Bloom
サイト管理人様まで… 本当に感謝いたします!
管理人様のご紹介の本の概要を拝見してみました。
もうすでに覚えてしまったことも、本から見る事で復習になるのでいいですね
明日にでも大型書店に行ってあるかどうか見てみたいと思います!
アドバイス本当に嬉しいですありがとうございます
朝から晩まで(笑)
お正月はそんな感じでした。
強化合宿のようでした・・・
新しい事を覚えるのは楽しいので全く苦痛ではなかったです
普段はどうしても夜遅くまで仕事してる為、聞きづらいですね。
あまり主人に頼りすぎないよう自力で頑張ろうと思っています
書籍やサイトを参考にですね