teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

m

2018/10/28 12:44

投稿

yumetodo
yumetodo

スコア5852

answer CHANGED
@@ -47,4 +47,42 @@
47
47
 
48
48
  moji="Hello";//Cだとmojiを文字列リテラルが格納される領域へのポインタで初期化(C++では代入)
49
49
  moji=str;//配列変数strの先頭要素へのポインタをmojiに代入
50
- ```
50
+ ```
51
+
52
+ ---
53
+
54
+ ほんだいからずれますが、ちょっと突っ込ませてください。
55
+
56
+ ```c
57
+ a = rand() % 10 + 0;
58
+ ```
59
+
60
+ 乱数の範囲調整に剰余を用いてはいけません。
61
+
62
+ ```c
63
+ (isdigit(str[0]) == 0 || isdigit(str[1]) == 0 || isdigit(str[2]) == 0)
64
+ ```
65
+
66
+ 3桁だからこれでもなんとかなってますが、`strtol`系関数の利用を検討してください。
67
+
68
+ [C言語で安全に標準入力から数値を取得 - Qiita](https://qiita.com/yumetodo/items/238751b879c09b56234b)
69
+
70
+ ```c
71
+ rewind(stdin);
72
+ ```
73
+
74
+ やめましょう。
75
+
76
+ ```c
77
+ scanf("%c", &ch); //putchar(ch);ch=getchar();でも可能
78
+ ```
79
+
80
+ scanfは冗長じゃないかなぁ・・・。putcharはお話しにならんですが、getcharなんかを使えばいいかと
81
+
82
+ ```c
83
+ scanf("%d", &t);
84
+ ```
85
+
86
+ scanfで数値変換するべきではありません。
87
+
88
+ [C言語で安全に標準入力から数値を取得 - Qiita](https://qiita.com/yumetodo/items/238751b879c09b56234b)

1

m

2018/10/28 12:44

投稿

yumetodo
yumetodo

スコア5852

answer CHANGED
@@ -24,4 +24,27 @@
24
24
 
25
25
  > 格納していたのはアドレスではなく、文字列ですか?
26
26
 
27
- の答えはわかりますね?
27
+ の答えはわかりますね?
28
+
29
+ ---
30
+
31
+ 追記
32
+
33
+ 配列を文字列リテラルで初期化できるというのは特例と考えるべきです。
34
+
35
+ ```c
36
+ char str1[] = "arikitari na sekai";//OK
37
+ char str2[] = { "arikitari na sekai" };//OK
38
+ char str3[19] = { 0 };
39
+ //str3 = "arikitari na sekai";//NG
40
+ ```
41
+
42
+ さて、お示しのコードを解釈していきましょう(constを付け加えています、文字列リテラルが格納される領域は書き換えてはいけないので)
43
+
44
+ ```c
45
+ const char *moji;
46
+ char str[10]="Hello";//配列を文字列リテラルで初期化
47
+
48
+ moji="Hello";//Cだとmojiを文字列リテラルが格納される領域へのポインタで初期化(C++では代入)
49
+ moji=str;//配列変数strの先頭要素へのポインタをmojiに代入
50
+ ```