答え

標準関数を自分で宣言しているのが間違い!
long strlen(char *s);

標準関数はインクルードして使うのが正解!
#include <string.h>
解説
標準関数はすべて、規格で形式が決められています。strlen()
の場合はこうです。
size_t strlen(const char *s);
問題のプログラムでは、違う形式で宣言してしまっていますね。これがエラーの原因です。

つまり、正しい形式で宣言すればエラーが出なくなるわけですね。

まぁ、それはそうなんだけれども……。
標準関数は、そもそも自分で宣言する必要がありません。対応するヘッダーファイルを、ただインクルードすればよいのです。strlen()
のような文字列を操作する関数は、<string.h>
に宣言があります。使い方を忘れてしまっても、リファレンスを確認すればしっかり書いてあるはずです。

なるほど。言われてみれば当たり前って感じがしますね。

でしょ。

はい。こういう間違いはしない気がします!

ふふふ。そう願いたいわね。
実はこれ、あるベテランのソフトウェアエンジニアが本当にやっていた間違いをベースにした出題でした。その人は、わざわざコンパイラのオプションでエラーをねじ伏せておいて、「なぜクラッシュするんだ」と悩んでいました。そのくせ自信があるものだから、リファレンスもろくに読まないわけです。間違えるはずがないと思い込んでいると、深みにハマッて抜け出せなくなることもあるんですね。
ここがポイント!

標準関数は、しっかり使い方を調べてから使いましょう!
修正後のプログラム
main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char textA[] = "Hello!";
char textB[] = "Hi!";
if (strlen(textA) > strlen(textB)) {
printf("%s is longer then %s\n", textA, textB);
}
return EXIT_SUCCESS;
}
実行結果
Hello! is longer then Hi!