#include <stdio.h>
int main(void) {
char str[] = "0123456789";
printf("%d\n", str[2] + str[4]);
}
なぜ、配列の書き方が char str[] = "0123456789"の場合は
str[2] + str[4]の足し算が50+52で102と10進数で出るのでしょうか?
そういうルールなのでしょうか?
てっきり答えは6と思っていました。
また、
#include <stdio.h>int main(void) {
char str[] = { 1,2,3,4,5 };
printf("%d\n", str[1] + str[3]);
}
の char str[] = { 1,2,3,4,5 }; とした場合は6と出ます。
char str[] = "0123456789";とchar str[] = { 1,2,3,4,5 };は同じ書き方だと思っていましたが、その文字列を扱う変数によっては、例えば配列などによっては扱いが違うと今更ながらわかりました。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
#2です。
#2のお礼に対して
>0.はただの数値
これは正解。
>'0'は0とい値
>"0"は0という文字
この二つは違う。
この点はC言語で文字を扱う際に最も重要な点です。しっかりとここで身に着けるように。
'0'とシングルクォーテーションで挟み込んだ文字は文字リテラルと呼ばれ、間に挟み込まれた1文字を示すコードになります。
'0'はASCIIコードだと0x30という数値になります。
"0"とダブルクォーテーションで挟み込んだ文字(列)は文字列リテラルと呼ばれ、char型の定数配列として扱われます。
""の間のものは文字として取り扱われ、この配列は'\0'で終端されます。
"0"と同じ要素を持つ配列は{'0','\0'}です。
上記のことを参考に質問の二つの宣言の違いを見てみましょう。
char str[]="0123456789";
は文字配列strを文字列リテラル"0123456789"の中身で初期化しています。
この文字列リテラルは11文字から構成されていますので、要素数11の配列として初期化されます。
その構成要素は{'0','1','2','3','4','5','6','7','8','9','\0'}です。(ここでのシングルクォーテーション(')を省略してはいけません)
char str[]={0,1,2,3,4,5};
は文字配列strを数字の0,1,2,3,4,5を要素として持ちます。''で囲んでいないので単なる数値です。
文字も所詮は数字で表されているのでchar型に数字を代入することも可能なのです。まともな文字にコードされるとは限りません。バックスペース(BS)やエスケープ(ESC)になるかもしれません。
No.3
- 回答日時:
ASCIIコード表を参照ください。
https://www.k-cube.co.jp/wakaba/server/ascii_cod …
char str[] = "0123456789";
又は
char str[] = { '0','1','2','3','4','5','6','7','8','9','\0'};
としたときの、"0123456789"の値は、
10進数では48~57になります。
つまり
char str[] = "0123456789";
と
char str[] = { '0','1','2','3','4','5','6','7','8','9','\0'};
と
char str[] = { 48,49,50,51,52,53,54,55,56,57,0};
は全て同じことになります。
No.1
- 回答日時:
>そういうルールなのでしょうか?
そうです。
>同じ書き方
同じにするなら、こんな感じ:
char str[] = "0123456789";
char str[] = { '0','1','2','3','4','5','6','7','8','9','\0'};
変数strは、char型の配列です。扱い方も前者と後者で変わりありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# C言語 少しの疑問 4 2022/11/08 02:48
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
nullと""、\\0とEOFの違いにつ...
-
C#でstringをポインタとして渡す
-
アルファベットをカウント、
-
binaryに対して正規表現を適用...
-
Shift_JIS(16進)を文字に変換す...
-
sprintf関数での文字列変換につ...
-
TCL言語で文字列検索方法を教え...
-
char型配列の最大要素数
-
C言語についてです学籍番号、名...
-
シリアル通信で0x00を送信した...
-
[C++]WCHARの1文字目しか表示で...
-
VBを2008を用いてCSVを取り込む...
-
C++で入力した文字列から数字を...
-
C言語の勉強しています。すみま...
-
ソースコードの間違い (C言語)
-
%dなどの違い
-
NUMERICチェック
-
文字列型の一般的な変数名は?
-
セグメントエラー
-
C言語 配列の長さの上限
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムによく出てくるst...
-
nullと""、\\0とEOFの違いにつ...
-
TCL言語で文字列検索方法を教え...
-
C#でstringをポインタとして渡す
-
C++で入力した文字列から数字を...
-
%dなどの違い
-
WSH(VBS)でJSONの文字列を読み...
-
16進数を2文字ずつ配列に格納し...
-
シリアル通信で0x00を送信した...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
構造体→文字列→構造体 をする方法
-
VBA-DLLの引数受け渡しについて
-
[C++]WCHARの1文字目しか表示で...
-
数字の入った配列をファイルへ...
-
VB6.0でのバイナリデータの扱い...
-
引用符と二重引用符
-
こんなことって可能なのですか...
-
char型配列の最大要素数
-
sprintf関数について教えて下さ...
-
C言語の課題で困っています;
おすすめ情報