c言語におけるget()関数の原理と戻り値
まず覚えておきたい言葉はNever use gets()です.
これはgets()関数がターゲット配列が入力を収容できるかどうかをチェックしないためであり,1つの文字列をプログラムに読み出すには,文字列を格納する空間を予約することが最初に行われる.したがって、割り当てられた空間が大きくなく配列が境界を越えやすいが、gets()関数はこの点をチェックしないため、プログラムに脆弱性が生じやすく、有名な「ワーム」ウイルスの原理は、長いデータで元のデータを上書きしてクラッシュを引き起こすことである.だから重要なプログラミングに対して、gets()を使わないでください!
1,gets()のパラメータはアドレスであり,キーボードから入力された値から決定された値をメモリに格納するため,アドレスを指定する必要があり,通常gets(配列名)という方法で入力された文字列を所定の配列に伝達する.注意:この配列の大きさは必ず事前に定義しておきましょう.配列のサイズを定義しないと、入力時に文字列をどのメモリに入力したのか分からない可能性があり、そのメモリの元のコードを上書きする可能性があります.
2, gets()の最初の使い方:gets(array's name)を直接使う;この方式では、いつ文字列の最後になるか分からないので、「gets()関数」を入力するたびに、改行文字の前のすべての内容を自動的に読み取り、最後に「0」を付けて、この文字列を呼び出したプログラムに直接返し、gets()を読み込んで、読み込んだ「破棄」します.これにより、次の読み取りは新しいローで開始されます.
例1:
3, gets()のプロトタイプ:char*gets(char*s)
{
...
return s;
}
したがって、gets()はcharタイプのデータを指すポインタを返し、このポインタは彼に渡されたポインタと同じであることがわかります.そのため、次のプログラムがあります.
例2:
4、実際にgets()には2つの可能な戻り値タイプがあります.
1)プログラムが文字列を正常に入力した場合:文字列を読み込んだアドレス、すなわち文字列が格納された配列のヘッダアドレスを返す. 2)プログラムにエラーが発生したり、ファイルの末尾に遭遇した場合:空のポインタNULLを返し、空のポインタと空の文字を混同しないように注意する('0');
エラーを検出するには、次のような方法が便利です.
while(gets(name) != NULL)
注意:現在はgets()は基本的に使用されず、廃棄された関数と言えるが、scanf()、getchar()、fgets()で代用できるようになった.
これはgets()関数がターゲット配列が入力を収容できるかどうかをチェックしないためであり,1つの文字列をプログラムに読み出すには,文字列を格納する空間を予約することが最初に行われる.したがって、割り当てられた空間が大きくなく配列が境界を越えやすいが、gets()関数はこの点をチェックしないため、プログラムに脆弱性が生じやすく、有名な「ワーム」ウイルスの原理は、長いデータで元のデータを上書きしてクラッシュを引き起こすことである.だから重要なプログラミングに対して、gets()を使わないでください!
1,gets()のパラメータはアドレスであり,キーボードから入力された値から決定された値をメモリに格納するため,アドレスを指定する必要があり,通常gets(配列名)という方法で入力された文字列を所定の配列に伝達する.注意:この配列の大きさは必ず事前に定義しておきましょう.配列のサイズを定義しないと、入力時に文字列をどのメモリに入力したのか分からない可能性があり、そのメモリの元のコードを上書きする可能性があります.
2, gets()の最初の使い方:gets(array's name)を直接使う;この方式では、いつ文字列の最後になるか分からないので、「gets()関数」を入力するたびに、改行文字の前のすべての内容を自動的に読み取り、最後に「0」を付けて、この文字列を呼び出したプログラムに直接返し、gets()を読み込んで、読み込んだ「破棄」します.これにより、次の読み取りは新しいローで開始されます.
例1:
#include
#include
#define MAX 81
int main(void)
{
char name[MAX];
printf("Hi, what's your name?
");
gets(name);
printf("Nice name, %s
", name);
return 0;
}
/*
Hi, what's your name?
Herry potter
Nice name, Herry potter
*/
3, gets()のプロトタイプ:char*gets(char*s)
{
...
return s;
}
したがって、gets()はcharタイプのデータを指すポインタを返し、このポインタは彼に渡されたポインタと同じであることがわかります.そのため、次のプログラムがあります.
例2:
#include
#include
#define MAX 81
int main(void)
{
char name[MAX];
char * ptr;
printf("Hi,what's your name?
");
ptr = gets(name); // ptr char , ptr name 。
printf("%s? Ah? %s!", name, ptr); // name ptr , , 。
return 0;
}
/*
Hi,what's your name?
Herry
Herry? Ah? Herry!
*/
4、実際にgets()には2つの可能な戻り値タイプがあります.
1)プログラムが文字列を正常に入力した場合:文字列を読み込んだアドレス、すなわち文字列が格納された配列のヘッダアドレスを返す. 2)プログラムにエラーが発生したり、ファイルの末尾に遭遇した場合:空のポインタNULLを返し、空のポインタと空の文字を混同しないように注意する('0');
エラーを検出するには、次のような方法が便利です.
while(gets(name) != NULL)
注意:現在はgets()は基本的に使用されず、廃棄された関数と言えるが、scanf()、getchar()、fgets()で代用できるようになった.