質問のコードには多くの問題が含まれています。それら一つ一つを詳しく説明するには余りにも長くなってしまいますので、修正したコードを用意しました。こちらをお使いください。
C
1#include <stdio.h>
2#include <string.h>
3
4int main(void)
5{
6 // assert(CHAR_BIT == 8);
7 // assert(sizeof(folat) == 4);
8
9 float data = 0.75f;
10
11 unsigned long buff = 0;
12 memcpy(&buff, &data, 4);
13
14 char s[35] = {0};
15 for (int i = 33; i >= 0; i--) {
16 if (i == 1 || i == 10) {
17 s[i] = '-';
18 } else {
19 if (buff % 2 == 1) {
20 s[i] = '1';
21 } else {
22 s[i] = '0';
23 }
24 buff /= 2;
25 }
26 }
27
28 printf("%s\n", s);
29}
上のコードをそのまま貼り付けて実行すれば、エラーはでなくなるはずです。
今後の方針としては、その本を捨ててください。
質問のコードには致命的な間違いが複数含まれています。エラーメッセージからエラーとなる部分は特定できませんが、コード自体の間違いの他、書き写し間違いや、実行時の勘違いなど、複数の問題がおきていると考えられます。ですが、**本に書かれていたというコード(質問文に書いているコード)そもそもがおかしいため、何がどうなっているのかを把握することすら困難です。**よって、その本自体が学習者に混乱をもたらしていると考えられます。
つまり、その本は役に立つどころか害悪であると私は判断します。即座に捨て内容を忘れることをお勧めします。
ここから先は蛇足の説明です。C言語がわかる人しかわからないないようですので、無視してください。
-
Cの標準仕様ではmain
関数の戻り値はint
です。一部の古い環境ではvoid
も許されますが、ほとんどの環境ではエラーまたは警告が表示されます。
-
Cの関数定義で()
内を省略することは、どのような引数も受け付けるという意味です。引数を受け取らないという意味ではありません。
-
float
が32ビット(4バイト)であることが前提になっています。また、-
の挿入位置はIEEE754単精度浮動小数点数を前提にしていますが、これも環境依存です。
-
32個の'0'または'1'と2個の'-'の計34の長さの文字列を配列s
に格納するためには、s
は35のサイズが必要です。
-
s
が初期化されておらず、'\0'
の挿入も無いため、最後にNUL文字があるとは限りません。つまり、NUL終端文字列となっていない可能性があります。
-
s[34] = "¥n";
は無名な静的文字列"¥n"
へのポインターをs
の34番目に文字として代入しているという意味不明なコードです。
-
「\」(U++5C)と「¥」(U+00A5)は違います。Windowsで「¥」を入力する方法は非常に限られているため問題になりませんが、MacのJISキーボードでは「¥」と書かれた所を押すと「¥」になります。**まともな入門書では、この「\」と「¥」の違いが最初に詳しく書いています。**もし、それが書いていないのであれば、「初心者が読むには難しい難度が高い本」または「入門向けと書かれているが不親切で役に立たない悪書」のどちらかです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/07 16:59
2021/03/08 09:20 編集
2021/03/08 11:10
2021/03/08 17:03