文字列を入力させて一文字ずつずらすプログラムを作りました。 8文字以内で入力させるようにしたのですが、ビルドしてもエラーも警告も出ないのに、 もの凄く長い文字を入力するとデバッグエラーが発生します。 Run-Time check Failure #2 - Stack around the variable 'string" was corrupted.
どうすればいいのでしょう?
#include <stdio.h> #include <string.h>
main() { unsigned char i; char string[8];
for (;;) { puts("1〜8文字入力してください。"); scanf("%s", string); if (strlen(string) <= 8) { break; } }
for (i = 0; i < strlen(string); i++) { string[i] = string[i] + 1; } printf("%s\n", string); }
#defineとかの解釈アルゴリズム詳しくわかる人いる? Cコンパイラ自作しようと思ったが、初めにマクロの解釈でつまずいた。 int a = 1; int b = 2; #define b a + b #define a a + b printf("%d", a); 例えばこれで何が出力されるか実際に試さないとなかなかわからないと思うが。 あと関数内にマクロを書いた場合、ソース上のどの範囲で有効になるかとか。
>>571 > ファイルの上から順に、単純に文字列置換していくだけでいいのでは? とりあえずいろいろ試して#defineの仕組みがだいたいわかってきたので参考までに。 どうやら上から順番に置換していくわけではないようです。 ちなみに#defineの行の自体は他の#defineにより置換されることはないようです。 例えば次の例を使うと int a = 1; int b = 2; #define b a + b #define a a + b printf("%d", a); まず、#defineの第1字句がaと一致するものを検索して置換します。 a → a + b そしてこの#defineにフラグを立てます。一度使った#defineは置換完了まで再び使われません 次にこのaとbに対して再び置換を試みます。 a の#defineはさっき使ったのでもう使用不可です。そこで b に対してのみ置換が行われます。 a + b → a + a + b そしてこの#defineにもフラグを立てます。 次にこのaとbに対して置換が試みられます。もう使用できる#defineはないのでここで終了です。 こうやって使用できる#defineがなくなるか、もしくは どの字句も全ての#defineの1字句目と一致しなくなれば終了です。
>>596 「一度使った#defineは置換完了まで再び使われません」というのが多少気になる。余計なお世話かもしれんけど、こんなの考えてみた。 int a = 1; int b = 2; int c = 3; #define a a + b #define b a + c #define c b #define d a + b + c printf("%d", d); 意味判らん気味だけど、最終的に a + a + b + a + b + b + a + b + c = 15 になります。たぶんこれくらいややこしいのが正常に展開できたら問題ないんじゃないかと。>>596だと、 d (dを展開)→ a + b + c (aを展開)→ a + b + b + c (bを展開)→ a + a + b + a + b + c (cを展開)→ a + a + b + a + b + b (終わり) になりそうな気がして。