質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

734閲覧

C言語:変換指定子について

rokku

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/05/29 02:40

前提・実現したいこと
①printf文でwork[0]の値を出力するときの変換指定子を「%d」にすると「15」が出力されるのかが分からないです。
char型なので変換指定子は「%s」なのではないかと思っています。
②main.c(3)のprintf("%d",work[0]); → printf("%s",work[0]);にするとメモリアクセス違反となるのかも教えていただきたいです。

該当のソースコード
main.c
void main(void) {
char work[1] = {15};
printf("%d",work[0]);
}

試したこと
①変換指定子について調べたが、今回の事象についての記事を見つけることができなかった。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

①printf文でwork[0]の値を出力するときの変換指定子を「%d」にすると「15」が出力されるのかが分からないです。
char型なので変換指定子は「%s」なのではないかと思っています。

printf("%d",work[0]); で work配列の[0]を指定していますね。
なので、当然ながら15が表示されます。

②main.c(3)のprintf("%d",work[0]); → printf("%s",work[0]);にするとメモリアクセス違反となるのかも教えていただきたいです。

work配列の[0]には数値の15が入っていますね。
つまりアドレス15をprintfに渡しているのでメモリアクセス違反になります。
work配列の先頭アドレスを指定するときはworkまたは&work[0]と書きましょう。
ちなみに値15は制御コードなので何も表示されないか文字化けすると思います。
またC言語において文字列はNULL終端である必要があるので、work配列の領域を超えて表示されるおそれがあります。

投稿2020/05/29 02:54

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rokku

2020/05/29 04:37

ご回答頂き、ありがとうございます。
guest

0

ベストアンサー

①printf文でwork[0]の値を出力するときの変換指定子を「%d」にすると「15」が出力されるのかが分からないです。

数値の15を数値として表示するなら、%dが正しいです。char型の引数(char *ではない1個だけ)を可変長引数に渡すと、intに自動変換されます。

②main.c(3)のprintf("%d",work[0]); → printf("%s",work[0]);にするとメモリアクセス違反となるのかも教えていただきたいです。

%sは、char *文字列として表示したいときに使うものです。charの値を渡してしまうと、それをポインタとして参照しようとするので、正しく動作しません。

投稿2020/05/29 02:50

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rokku

2020/05/29 04:36

char型の引数を可変長引数に渡すと、intに自動変換されるということを初めて知りました。 また、char型は整数型ということも初めて知りました。 この説明を受けて、理解できました。 ご回答頂き、ありがとうございます。
guest

0

%sは、文字列のフォーマット文字列です
char型は文字型ではなく、1バイト幅の整数型、です。

投稿2020/05/29 02:43

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuma-s

2020/05/29 03:33

char型は文字型であり、整数型でもあります。 「三つの型 char,signed char 及び unsigned char を総称して文字型(character type)と呼ぶ。」 と規格書にはっきり書かれています。 JIS X3010:2003(ISO/IEC 9899:1999) ------------------------------------------------------------------------- 6.2.5 型  オブジェクトに格納した値又は関数の返す値の意味は,それをアクセスするのに 使われる式の型(type)によって決定する。(オブジェクトとして宣言された識別子は 最も単純な式とし,その型は識別子の宣言において指定された型とする。)型は, オブジェクト型(object type)(オブジェクトを完全に規定する型),関数型(function type)(関数を規定する型),及び不完全型(incomplete type)(オブジェクトを規定 する型で,その大きさを確定するのに必要な情報が欠けたもの)に分類する。  型_Bool として宣言されたオブジェクトは,値 0 及び 1 を格納するのに十分な大きさをもつ。  型 char として宣言されたオブジェクトは,実行基本文字集合の任意の要素を 格納するのに十分な大きさをもつ。実行基本文字集合の任意の要素を char 型の オブジェクトに格納した場合,その値は非負であることを保証する。その他の文字 を char 型のオブジェクトに格納した場合,その結果の値は処理系定義とするが, その型で表現可能な値の範囲に含まれなければならない。  標準符号付き整数型(standard signed integer type)は,signed char,short int,int,long int及び long long int の 5 種類とする。[これらの型及び他の 型は幾つかの別の方法で指定してもよい(6.7.2 で規定する。)。] さらに,処理系 定義の拡張符号付き整数型(extended signed integer type)(28)を処理系が提供 してもよい。標準符号付き整数型及び拡張符号付き整数型を総称して符号付き整数 型(signedinteger type)と呼ぶ(29)。  型 signed char として宣言されたオブジェクトは,単なるchar型のオブジェク トと同じ大きさの記憶域を占有する。単なるint型のオブジェクトは,実行環境の アーキテクチャによって決まる自然な(ヘッダ<limits.h>に定義される INT_MIN から INT_MAX までの範囲にある任意の値を格納するのに十分な)大きさをもつ。  符号付き整数型の各々に対応するが,それとは異なる符号無し整数型が存在する (キーワード unsignedで示される)。符号無し整数型は,符号付き整数型と(符号 情報を含めて)同じ大きさの記憶域を使い,かつ同じ境界調整要求をもつ。型_Bool, 及び標準符号付き整数型に対応する符号無し整数型は,標準符号無し整数型 (standard unsigned integer type)とする。拡張符号付き整数型に対応する符号 無し整数型は,拡張符号無し整数型(extended unsigned integer type)とする。  標準符号無し整数型及び拡張符号無し整数型を総称して符号無し整数型(unsigned integer type)と呼ぶ(30)。  標準符号付き整数型及び標準符号無し整数型を総称して標準整数型(standard integer type)と呼び,拡張符号付き整数型及び拡張符号無し整数型を総称して 拡張整数型(extended integer type)と呼ぶ。  二つの整数型が,符号の有無に関して同じであり,整数変換の順位(6.3.1.1 参照) に関して異なる場合,整数変換の順位が低い型の値の範囲は,もう一方の型の値の 範囲の部分集合とする。  符号付き整数型の負でない値の範囲は,対応する符号無し整数型の範囲の部分 集合とし,二つの型において同じ値の表現は同じとする(31)。符号無しオペランド を含む計算は,決してオーバフローしない。すなわち,結果を符号無し整数型で 表現できないときは,その型で表現しうる最大値より 1 だけ大きい数を法とする 剰余を結果とする。  ...  型 char,符号付き整数型,符号無し整数型及び浮動小数点型を総称して基本型 (basic type)と呼ぶ。たとえ,処理系が二つ以上の基本型を同じ表現で定義しても, これらは異なった型とする(34)。  三つの型 char,signed char 及び unsigned char を総称して文字型(character type)と呼ぶ。処理系は,char を,signed char 又は unsigned char のいずれか と同じ値の範囲,同じ表現形式,そして同じ動作をするものとして定義しなければ ならない(35)。  列挙体(enumeration)は,名前付けられた整数定数値から成る。それぞれの列挙 体は,異なる列挙型(enumerated type)を構成する。  型 char,符号付き整数型,符号無し整数型,及び列挙型を総称して整数型 (integer type)と呼ぶ。整数型及び実浮動小数点型を総称して実数型(real type) と呼ぶ。
rokku

2020/05/29 04:37

ご回答頂き、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問