回答受付が終了しました

苦しんでCを読んでchar型は文字列しか表せないとわかっていますが、

補足

苦しんでCを読んでchar型は文字列しか表せないとわかっていますが、 例えばchar str[] = "0123456789";を文字としての123456789ではなく数値としての123456789として表示することは可能なのでしょうか? 多分、char型をint型に変えるなどしないといけないのかなとは思っています。

C言語関連187閲覧

回答(7件)

0

>char型は文字列しか表せないとわかっています 違います、char型は整数型の一種です。 1byteですらありません。(1byteで扱うと便利なCPUが多いのでそれ以外を知らないだけ) 整数、文字、文字コード、文字列とは何ですか? C言語で 「文字」「文字列」をどう扱っているのか記します 最も深いレベルでは0,1しか扱えないコンピュータで,文字を扱う為の取り決めが文字コードです ASCII文字コードとかそれを拡張した UNICODE が今のはやりですね ASCII文字コードを入れるのにいろいろ都合が良いのが char型です char型に文字を入れるのではありません、その文字を表す ASCIIコードという整数値を入れるのです (整数型でも数値としての整数を入れるのにいろいろな点で都合がよいのが int型です) 「やぁ太郎さん」「やぁ花子さん」とはコンピュータでも表示したいです 「やぁXさん」を用意して X を「太郎」「花子」と置き換えるというプログラムを書きたいです これを実現する為、C以前の言語では「文字列型」という物が採用されました。 組込型は「組込関数」でしか扱えません、 文字列型変数を扱う為の文字列処理組込関数の数を増やす開発競争になりました 開発競争をみて、デニス・リッチーは考えました、 (最低限のサポートは必要だけど) 処理はユーザーにプログラムしてもらえばいいんじゃねぇ? C言語には、文字列型はありません。(先人が開発したサブルーチン群が標準関数として付属してくる場合が多いですが) Cが登場した頃の謳い文句に「 C言語は、文字列処理が得意である」と言うのがあったんですが 、ちゃんちゃらおかしいですよね、文字列型が無いんですよ! で、文字列をどう扱うか? int main(int argc, char ** argv){ _ char arry[] = "ABCD"; _ char * p; _ _ p = arry; _ _ *(p+1) = 'b'; _ arry[2] = '6'; _ printf("p is <%s>\n", p); _ printf("arry is <%s>\n", arry); _ if ( strcmp(p, arry) == 0) printf( "p and arry is same\n"); _ return 0; } 実行すると p is <Ab6D> arry is <Ab6D> p and arry is same と表示されます 「 p = arry; 」は、「charへのポインタ p に char型変数の配列 arry の先頭アドレスの値を代入する」が正しい構文解析です でも、「文字列型変数 p に文字列型変数 arry を代入する」に見えるでしょ! デニス・リッチーは、 「文字列型変数を扱っている様に見せる!」 為に、ポインタとか配列とかの仕様を決めたのだと思いますよ 初学者には悪夢でしかない「ポインタの壁」「配列の壁」です 解ってる人には「とても便利」な記法なんですけどね

あ!違った 誤>「charへのポインタ p に char型変数の配列 arry の先頭アドレスの値を代入する」 正>「charへのポインタ p に char型変数の配列 arry の先頭要素のアドレスの値を代入する」 ついでに、以下って何が起きるか解る? char c1,c2; c1 = 1; c2 = '2'; int i1 , i2; i1 = 1; i2 = '2';

0

何も分かっていませんね。 char型は「1バイト」の整数型で、-128~127の値を表せます。それぞれの値が「何を意味するのか?」は『こちら側』で決めることであり、「文字列しか表せない」という事実は存在しません。 「コンピュータにおいて文字とは何なのか?」が理解できれば、「数字」と「数値」の相互変換は容易く可能です。

1

苦しんで覚えるC言語のWeb版を読んでみましたが、そんなことは書いてありませんでした。 この質問は、苦しんで覚えるC言語の「14章:文字列を扱う方法」を読めば解決するものと思われます。 https://9cguide.appspot.com/14-01.html 「苦しんで覚える」という題名に反し、とても基礎的なところを「ここまで書かなくても」というくらい丁寧に解説してあるので、まずこれを斜め読みではなく読破し、練習問題を自分ひとりの力だけで解けるくらい読み込むのが良いと思います。 そうすると、質問をするのが非常に楽になり、「もっと基礎を」とたびたび言われなくて済むようになるので、精神的にも楽になるでしょう。 ただこの本、本当に初心者の学習向けの簡単なところしか書いていないので、実際にプログラムをするにはこれだけでは不十分です。これに沿ってプログラミングすると、「それではだめ」と言われると思います。これが終わった後でもう一冊、プログラミングガイドを読みましょう。

1人がナイス!しています

なお練習問題の数が限られているので、勘で答えて回答を見るようなことをするとすぐに尽きてしまいます。二回目からはその記憶で解けるので意味がありません。解答例を見なくても自分の答えが全問正解と確信できるようになって初めて解答例を見てください。

0

> char型は文字列しか表せないとわかっていますが 間違った知識は即刻捨ててください。 Cでは文字列は「文字型(char型)の配列(メモリ上密にならんでいるもの)で、'\0'で終端されたもの」ということになっています。 char型は文字列の構成要素ですが、「文字列を表す」ことはあり得ません。 そもそも「配列」をわかっていないだけですか? > 文字としての123456789ではなく数値としての12345として 「文字」と「文字列」はしっかり区別してください。で、6789はどこに行ってしまったのでしょう? > 表示することは可能なのでしょうか? 問題は「表示する」ことなのですか? (という疑問は理解できますか? 表示結果において"12345"を表示したことと12345を表示したことは全く同一の結果になるので、「何の型のデータを表示するのか」ということは問題になりえないのです) > char型をint型に変える 「文字列をint型に」と勝手に解釈します。 #include <stdio.h> #include <stdlib.h> int main(void) { char str[]="0123456789"; int a,b,c; //atoi関数 手軽だが変換に失敗しても検出できない //10進数表記専用 a=atoi(str); //strtol/strtoul関数 変換出来なかった文字へのポインタを監視することで変換失敗を検出できる //2~16進数に対応できる char *p; b=strtol(str,&p,10); if(p==str){//一文字も変換出来なかった printf("変換失敗\n"); } //sscanf関数 関数の戻り値を監視することで変換失敗を検出できる //8,10,16進数に対応できる int n=sscanf(str,"%d",&c); if(n==0){//変換できたデータ数が0だった printf("変換失敗\n"); } printf("%d %d %d",a,b,c); return 0; }

もちろん、ライブラリ関数など使わずに自力で文字列<->数値の変換プログラムが書けないとしたら、とても「基礎を理解した」とは言えません。 (実用上は、関数が用意されているのにいちいち自分で書くものではないですが) 学校の試験ではないので「答案がある」状態にすることが目的ではありません。コピペするのでなく、誰かに答えを教えてもらうのでもなく、「自分でできる」ようになるまで精進して下さい(って言われてやる素直さがあるならCに関わって3年以上経ってこんな質問しないですね)。