main関数の中のs
とhanten関数のなかのs
はそれぞれ独立しており、別物だからです。hanten関数でのs
には入力された文字列が入っているわけでは無く、char s[80];
で初期化されたときの文字列(何が入るかはコンパイラや環境によって異なります。今回は毎回"フフフフ"から始まる文字列だったというわけです。)が入っています。単純にそれが出力されただけです。
詳細な解説など
修正してみたコードを下記に示します。
http://ideone.com/f08zmt
このコードで修正した問題点をあげます。
- マジックナンバー(
80
の部分)を使用すべきではない。
char配列のサイズを80
と直接書いていますが、この書き方はマジックナンバーと言われ、どのようなプログラミング言語であっても推奨されません。マクロを使って定義することを推奨します。
C
1#define BUFF_SIZE 80
2...
3 char s[BUFF_SIZE];
- 関数宣言や定義で引数部分を省略(
()
)を使用すべきではない。
C言語において、関数宣言・定義における仮引数部分が無い、つまり()
と書くことは、「引数は何でもいい」といいという意味です。これはどのような引数をつけて関数を呼び出してもコンパイルエラーにはなりません。また、別のところで仮引数を定義しないと、その引数を使うこともできません。文字列を渡したいのなら、きちんと宣言・定義両方に書くべきです。逆に、引数を何も渡さないとするなら、(void)
と明記してください。
C
1void hanten(char *s);
2...
3void hanten(char *s) {
4 // sは仮引数として使うため、char s[80];をいれてはいけません。
5 ...
6}
gets
を使用してはいけない。
C言語のgets
はセキュリティ上の問題があるため使用してはいけません。代わりにfgets
等を使用してください。また、gets
は最新のC言語仕様(C11)では廃止されています。
参照: Wikipedia: gets
C
1 fgets(s, BUFF_SIZE, stdin);
- 文字列の長さを知りたいなら
strlen
を使おう。
while部分でどこまで文字列があるかを確認しているようですが、標準関数に文字列の長さを調べるstrlen
があります。車輪の再開発はせずに、なるべく標準関数を使いましょう。
C
1#include <string.h>
2...
3 k = strlen(s);
4 for (i = (k >= 4 ? 3 : k - 1); i >= 0; i--) {
5 ...
kには長さが入りますので、k - 1
が最後の文字になることだけ注意してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/03 16:29