auの日記

プログラミング初心者の日記。(auはハンドルネームです)

C言語: puts関数はNULL文字(\0)で改行される

auです。

今回は「puts関数」を使用していた際に、改行しようとしていないのに改行されているので、どんな風に処理されているのだろうと思い調べてみました。

puts関数

#include <stdio.h>

int puts(char* s)

サンプル

#include <stdio.h>
#include <string.h>

int main(void) {
    char c[] = "Hello";
    char c1[5];

    puts("hello");             // 1
    puts("world\n");           // 2
    puts("");                  // 3
    puts("My name is au.");    // 4
    puts("1");                 // 5

    strcpy(c1, c);
    puts(c1);                  // 6

    return 0;
}

// 実行結果
hello
world


My name is au.
1
Abort trap: 6

puts関数は、sに代入された文字列を出力します。

出力する際に、文字列の後ろについているNULL文字(\0)は"\n"に変換されるため、勝手に改行されるような挙動になります。

3番: ""(ダブルクォーテーション)のみでも改行されました。

4番: scanfと違い、空白で改行されずに出力されました(scanfで空白で改行せずに出力する方法)

5番: puts(1)のようにすると、コンパイルでwarningが出ました。実行も"Segmentation fault: 11"となってしまいます。

6番: NULL文字がなくなるとどうなるのか気になり、NULL文字が入らない大きさの変数にstrcpyで実行した結果「Abort trap: 6」という結果が表示されました。
これについて調べてみると、配列の大きさを超えて代入してしまっているため、このような結果が表示されるそうです。