C言語文字列入出力関数
文字列入力
1つの文字列をプログラムに読み込むには、まず文字列を格納するスペースを予約し、入力関数を使用してこの文字列を取得する必要があります.Cライブラリにはscanf()、gets()、fgets()の3つの文字列を読み出す関数が用意されています.
ストレージスペースの作成
ストレージスペースは配列(char name[10])で割り当てることもできるし、C言語の動的メモリ割り当て関数で動的に割り当てることもできる.
scanf()はnameで指定されたアドレスに情報をコピーするため、この場合、パラメータは
初期化されていないポインタは、nameがどこを指しているかを示します.
gets()関数
gets()(get string)関数は、システムの標準入力デバイス(通常はキーボード)から文字列を取得するインタラクティブなプログラムに便利です.文字列には所定の長さがないため、gets()関数は、出会った最初の改行記号()が入力を終了すると判断し、リターンキーを押すことでこの文字を生成することができる.改行文字を含まない改行文字の前のすべての文字を読み込み、その後に空白の文字(0)を追加します.
エラーが発生したり、ファイルの最後に遭遇したりすると、空の(または0)アドレスが返されます.この空のアドレスは
空のポインタ、そしてstdio.hに定義された定数
NULLで表すと、以下のコードでいくつかのエラー検出を行うことができます.
注意:空のポインタと空の文字は違います.混同しないでください.空のポインタはアドレスであり、空の文字は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で定義します.
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()関数は、文字列が表示されると、自動的にその後に改行記号()を追加します.
fputs()関数
fputs()関数puts()関数はファイルバージョン向けで、主な違いは次のとおりです. fputs()関数は、書くファイルを説明するために2番目のパラメータが必要であり、stdout(standard output)をパラメータとして出力表示することができる. はputs()関数とは異なり、fputs()関数は出力に改行文字を自動的に追加しません.
1行を読み出して次の行に戻し、次の2つのループで実行できます.
printf()関数
puts()関数と同様にprintf()関数は文字列を出力する際にもパラメータとして文字列アドレスが必要ですが、printf()関数はputs()関数ほど便利ではありませんが、複数のデータ型をフォーマットでき、出力時に改行文字を自動的に追加しません.
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()関数の違い:
[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つの方法があります.いずれも、最初の空白以外の文字の開始に遭遇します.
文字列出力
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()関数はファイルバージョン向けで、主な違いは次のとおりです.
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()関数ほど便利ではありませんが、複数のデータ型をフォーマットでき、出力時に改行文字を自動的に追加しません.