C言語文字列入出力関数


文字列入力
1つの文字列をプログラムに読み込むには、まず文字列を格納するスペースを予約し、入力関数を使用してこの文字列を取得する必要があります.Cライブラリにはscanf()、gets()、fgets()の3つの文字列を読み出す関数が用意されています.
ストレージスペースの作成
ストレージスペースは配列(char name[10])で割り当てることもできるし、C言語の動的メモリ割り当て関数で動的に割り当てることもできる.
char *name;
scanf("%s", name);
上記のコードでストレージスペースを作成すると、コンパイラを通過する可能性がありますが、nameを読み込むと、nameはプログラム内のデータとコードを上書きし、プログラムが異常に終了する可能性があります.これは
scanf()はnameで指定されたアドレスに情報をコピーするため、この場合、パラメータは
初期化されていないポインタは、nameがどこを指しているかを示します.
gets()関数
gets()(get string)関数は、システムの標準入力デバイス(通常はキーボード)から文字列を取得するインタラクティブなプログラムに便利です.文字列には所定の長さがないため、gets()関数は、出会った最初の改行記号()が入力を終了すると判断し、リターンキーを押すことでこの文字を生成することができる.改行文字を含まない改行文字の前のすべての文字を読み込み、その後に空白の文字(0)を追加します.
[clef@rhel6164 c]$ cat test1.c
#include
#define MAX 81

int main(void)
{
    char name[MAX];
    char *ptr; //  char   

    printf("Please input your name.
"); ptr = gets(name); // name //gets() return printf("name, %s
", name); printf("ptr, %s
", ptr); return 0; }
コンパイル&実行:
[clef@rhel6164 c]$ gcc test1.c
/tmp/ccDJ9AHw.o: In function `main':
//  gets()                     ,      fgets()    gets()  
test1.c:(.text+0x1a): warning: the `gets' function is dangerous and should not be used. 
[clef@rhel6164 c]$ ./a.outPlease input your name.clefname, clef 
//  ptr name       ptr, clef
gets()関数が文字列を読み出す場合
エラーが発生したり、ファイルの最後に遭遇したりすると、空の(または0)アドレスが返されます.この空のアドレスは
空のポインタ、そしてstdio.hに定義された定数
NULLで表すと、以下のコードでいくつかのエラー検出を行うことができます.
while(get(name) != NULL)
は、getchar関数によって上記のエラー検出を完了することもできる.
while((ch = getchar()) != EOF)

注意:空のポインタと空の文字は違います.混同しないでください.空のポインタはアドレスであり、空の文字はcharタイプのデータオブジェクトであり、値は0であり、数字的には0で表すことができるが、概念は異なる:NULLはポインタであり、0はcharタイプの定数である.
fgets()関数
gets()関数は、実際に入力したデータが格納されているかどうかをチェックせず、多くの文字が隣接するメモリ領域に簡単にオーバーフローするため、上記のコードはコンパイル時にwarningがあります.fgets()関数とgets()関数の違い:
  • 最大読み込み文字数を説明するために2番目のパラメータが必要です.このパラメータ値がnの場合、fgets()は最大n-1文字または改行文字を1つ読むまで(自動的に空文字()が追加されるため)、この2つの中で最初に満たされるものから入力を終了します.
  • fgets()が改行文字に読み込まれると、gets()のように捨てるのではなく文字列に格納されます.
  • どのファイルを読むかを説明するために3番目のパラメータが必要であり、キーボードからデータを読み取る場合、stdin(standard inputを表す)をパラメータとして使用することができ、この識別子はstdioである.hで定義します.
  • [clef@rhel6164 c]$ cat test1.c
    #include
    #define MAX 81
    
    int main(void)
    {
        char name[MAX];
        char *ptr;
    
        printf("Please input your name.
    "); ptr = fgets(name, MAX, stdin); printf("name, %s
    ", name); printf("ptr, %s
    ", ptr); return 0; }
    コンパイル&実行:
    [clef@rhel6164 c]$ gcc test1.c //     warning  
    [clef@rhel6164 c]$ ./a.out
    Please input your name.
    clef
    name, clef
    //        ,  fgets()            
    ptr, clef
    
    [clef@rhel6164 c]$

    scanf()関数
    scanf()関数は%sフォーマットを使用して文字列を読み込むことができます.scanf()関数とgets()関数の主な違いは、文字列がいつ終わるかをどのように決定するかです.scanf()関数は、文字列(get string)を取得するのではなく、単語(get word)を取得することに基づいている.scanf()関数には、入力終了を決定する2つの方法があります.いずれも、最初の空白以外の文字の開始に遭遇します.
  • %s形式を使用する場合、文字列は次の空白文字(スペース、タブ、改行など)
  • に読み出されます(含まれません).
  • フィールド幅(%10 sなど)を指定すると、scanf()関数は10文字または最初の空白文字に遭遇するまで、両方が最初に満たす終了入力
  • を読み出す.
    文字列出力
    C言語には、puts()、fputs()、printf()の3つの出力文字列の標準ライブラリ関数があります.
    puts()関数
    puts()関数は、文字列パラメータのアドレスを与えるだけで簡単に使用できます.空の文字(0)に遭遇すると出力が終了します(空の文字が必要です).puts()関数は、文字列が表示されると、自動的にその後に改行記号()を追加します.
    [clef@rhel6164 c]$ cat test1.c
    #include
    #define DEF "I am a #defined string."
    
    int main(void)
    {
        char str1[80] = "An array was initialized to me.";
        const char * str2 = "A pointer was initialized to me.";
    
        puts("I'm an argument to puts()."); //         
        puts(DEF); //       
        puts(str1);
        puts(str2);
        puts(&(str1[5])); //     strl1[5],  str1      &,   [5]  ,   
        puts(str2+4);
    
        return 0;
    }
    
    コンパイル&実行:
    [clef@rhel6164 c]$ gcc ./test1.c
    [clef@rhel6164 c]$ ./a.out
    I'm an argument to puts().
    I am a #defined string.
    An array was initialized to me.
    A pointer was initialized to me.
    ray was initialized to me.
    inter was initialized to me.

    fputs()関数
    fputs()関数puts()関数はファイルバージョン向けで、主な違いは次のとおりです.
  • fputs()関数は、書くファイルを説明するために2番目のパラメータが必要であり、stdout(standard output)をパラメータとして出力表示することができる.
  • はputs()関数とは異なり、fputs()関数は出力に改行文字を自動的に追加しません.

  • 1行を読み出して次の行に戻し、次の2つのループで実行できます.
    char line[81];
    while(gets(line)) //      ,gets()         ,    
        puts(line);
    char line[81];
    while(fgets(line,81,stdin))
        fputs(line,stdout);

    printf()関数
    puts()関数と同様にprintf()関数は文字列を出力する際にもパラメータとして文字列アドレスが必要ですが、printf()関数はputs()関数ほど便利ではありませんが、複数のデータ型をフォーマットでき、出力時に改行文字を自動的に追加しません.