回答編集履歴

1

前回の回答の末が切れていたのを追記。サンプルコードの追記。

2016/08/07 05:45

投稿

flied_onion
flied_onion

スコア2604

test CHANGED
@@ -30,4 +30,140 @@
30
30
 
31
31
 
32
32
 
33
- だいたい同じですが、 '0x??'とか '0??'
33
+ だいたい同じですが、 '0x??'とか '0??' を指定した場合に%iは16進数や8進数として受け付けます。
34
+
35
+
36
+
37
+ ---
38
+
39
+
40
+
41
+ ## 追記
42
+
43
+
44
+
45
+ scanfの %i についてサンプルを書いておきます。
46
+
47
+ scanfで %i が 入力をどう整数かするかの参考にしてください。
48
+
49
+
50
+
51
+ scan_sample.c
52
+
53
+ ```c
54
+
55
+ #include <stdio.h>
56
+
57
+ #include <stdlib.h>
58
+
59
+
60
+
61
+ int main(){
62
+
63
+ int a;
64
+
65
+ scanf("%d", &a);
66
+
67
+ printf(" %%d -> %d (%%d)\n", a);
68
+
69
+ printf(" %%d -> %i (%%i)\n", a);
70
+
71
+
72
+
73
+ scanf("%i", &a);
74
+
75
+ printf(" %%i -> %d (%%d)\n", a);
76
+
77
+ printf(" %%i -> %i (%%i)\n", a);
78
+
79
+
80
+
81
+ int b,c;
82
+
83
+ char str[] = "012.012.0x12.";
84
+
85
+ sscanf(str, "%d.%i.%i.", &a, &b, &c);
86
+
87
+ printf("\n");
88
+
89
+ printf("%s -> a(%%d).b(%%i).c(%%i)\n", str);
90
+
91
+ printf(" a = %d\n", a);
92
+
93
+ printf(" b = %d\n", b);
94
+
95
+ printf(" c = %d\n", c);
96
+
97
+
98
+
99
+ char str2[] = "99.99.099.";
100
+
101
+ sscanf(str2, "%d.%i.%i.", &a, &b, &c);
102
+
103
+ printf("\n");
104
+
105
+ printf("%s -> a(%%d).b(%%i).c(%%i)\n", str2);
106
+
107
+ printf(" a = %d\n", a);
108
+
109
+ printf(" b = %d\n", b);
110
+
111
+ printf(" c = %d\n", c);
112
+
113
+
114
+
115
+ return 0;
116
+
117
+ }
118
+
119
+ ```
120
+
121
+
122
+
123
+ 結果。
124
+
125
+ コメントに書いた通りprintf では `%d`も`%i` も差はありません。
126
+
127
+ 2回目の入力で099など 8進数でありえないものを入力した場合は0になります。99は10進として判断されるので問題ありません。
128
+
129
+
130
+
131
+ ```
132
+
133
+ $ gcc scan_sample.c && ./a.out
134
+
135
+ 077
136
+
137
+ %d -> 77 (%d) # 077 を %d で受け付け、 %dで出力。77と解釈されている
138
+
139
+ %d -> 77 (%i)
140
+
141
+ 077
142
+
143
+ %i -> 63 (%d) # 077 を %i で受け付け、 %dで出力。63 (8進数で077)と解釈されている
144
+
145
+ %i -> 63 (%i)
146
+
147
+
148
+
149
+ 012.012.0x12. -> a(%d).b(%i).c(%i) # 左の文字列を、右の「変数(書式文字)」ので受け付けた場合
150
+
151
+ a = 12 # 012 10進
152
+
153
+ b = 10 # 012 8進
154
+
155
+ c = 18 # 0x12 16進
156
+
157
+
158
+
159
+ 99.99.099. -> a(%d).b(%i).c(%i)
160
+
161
+ a = 99
162
+
163
+ b = 99 # 接頭辞 0 や 0x がなければ 10進数として値を取得して変数に入っている。
164
+
165
+ c = 0 # 099 は先頭が0なので8進と判断されたが099は8進として不正なので
166
+
167
+ ```
168
+
169
+