gets() はキーボードから文字列を読み込む。puts() はコンソールに文字列を出力する。どちらも stdio.h が必要。
gets()
キーボードからの入力というのは、ユーザーが文字列に続いて Enter キーを押すまで。Enter キーが押されると、文字列を読み込んで最後にある改行をヌル文字に置き換えたうえで引数の配列に格納する。関数自体の戻り値は、入力が成功すると配列の先頭へのポインタを、失敗するとヌルポインタを返す。
次のプログラムでは、gets() の戻り値を p に格納して、p がヌルでないことを確認してから出力している。p も str も配列(文字列)の先頭のアドレスを保持しているので、同じ文字列が2回出力されるはず。
#include
int main(void)
{
    char *p, str[80];
    printf("Input string: ");
    p = gets(str);
    if (p) { /* if p is not null */
        printf("%s %s\n", p, str);
    }
    return 0;
}
前にも書いたと思うけど、コンパイルすると gets は危険だから使うべきじゃないと警告される。
実行例:
takatoh@nightschool $ ./sample_8_4a Input string: hello hello hello
puts()
puts() はポインタの指している文字列を出力する。その際、自動的に改行を追加する。
#include
int main(void)
{
    puts("A");
    puts("B");
    puts("C");
    return 0;
}
takatoh@nightschool $ ./sample_8_4b A B C
ちゃんと1つずつ改行されてる。
puts() は printf() よりもサイズが小さくて速い。なので、複雑な文字列を出力するのでなければ puts() を使ったほうが有利。