HIR-NET Home
運営者
オンラインソフト
運営者著書
CG
HIR-NETリンク集
C言語辞典
gets関数
gets function
語源
get string(文字列入力)
分類
C/C++標準ライブラリ/関数/入出力関数/入力関数/文字列入力関数
名称
端末文字列入力関数(terminal string input function)
対義
puts関数
類似
fgets関数
関連
fgetc関数
解説
gets関数は、文字列を読み込む関数です。標準入力ストリームから配列*s…に、ファイルの終わりか、改行文字まで文字を入力します。改行文字は捨てられ、配列には格納されません。配列に読み込まれた文字の直後には空文字が付加されます。
関数原型宣言ヘッダ
<stdio.h>
関数原型宣言例
入力文字列の格納先
↓
char *gets(char *s);
↓
NULL≠入力文字例
NULL=失敗
関数返却値
①成功時には s を返します。
②ファイルの終わりに達し、配列s に文字が読み込まれなかった場合は NULL(空ポインタ)を返します。この場合の配列の内容は呼出前と変化がありません。もちろん、文字列長として 0 になることもありません。
③操作中に読込エラーが発生した場合は NULL を返します。この場合の配列の内容は不定です。
注意
改行文字の扱いは関数によって逆になっています。
gets(捨てる ), puts (付加して出力)
fgets(読み込む), fputs(付加しない )
関数定義例1
規格どおり。
// gets.c
#include <stdio.h> // EOF,NULL,stdin,ferror,fgetc
char *gets( // 端末文字列入力関数
// GET String
// NULL≠入力文字列
// NULL=入力失敗
char *s) // =>入力文字列 String
{
char *const head=s; // sの先頭ポインタ保存
while(1)
{
int c=fgetc(stdin); // 1文字入力
if(c==EOF || c=='\n')
{
if(s==head || ferror(stdin))
return NULL; // ●入力失敗
break;
}
*s=c; // 配列に代入
s++; // sを進める
} // while
*s='\0';
//[解説]ファイルの終わりに達し、配列s に文字
// が読み込まれなかった場合はNULLを返し、配列
// の内容は不変。
// そのため、NULL を返す場合は *s='\0' は行わ
// ない。
return head;
} // gets
関数定義例2
改行のみの場合は配列の最初を空文字に。
// gets_2.c
#include <stdio.h> // EOF,NULL,stdin,ferror,fgetc
char *gets( // 端末文字列入力関数
// GET String
// NULL≠入力文字列
// NULL=入力失敗
char *s) // =>入力文字列 String
{
char *const head=s; // sの先頭ポインタ保存
while(1)
{
int c=fgetc(stdin); // 1文字入力
if(c==EOF || c=='\n')break;
*s=c; // 配列に代入
s++; // sを進める
} // while
*s='\0';
if(ferror(stdin))return NULL; // ●入力失敗
return head;
} // gets
関数定義例3
規格どおり。
// gets_3.c
#include <stdio.h> // EOF,NULL,stdin,ferror,fgetc
char *gets( // 端末文字列入力関数 GET String
// NULL≠入力文字列
// NULL=入力失敗
char *s) // =>入力文字列 String
{
char *const head=s; // sの先頭ポインタ保存
int c;
while((c=fgetc(stdin))!=EOF && c!='\n')
{
*s=c; // 配列に代入
s++; // sを進める
} // while
if(s==head || ferror(stdin))return NULL; // ●入力失敗
*s='\0';
return head;
} // gets
対話的な文字列入力
標準入力から文字列を入力するプログラムです。
// gets1.c
#include <stdio.h> // gets,printf,putchar
#include <stdlib.h> // EXIT_SUCCESS
int main(void)
{
char s[256]; // 配列宣言
while(1)
{
s[0]='\0';
//[解説]改行のみの場合は配列不変のため
putchar('>'); // プロンプト
gets(s);
if(s[0]=='\0')break; // 改行のみ
printf("[%s]\n",s);
} // while
return EXIT_SUCCESS;
} // main
実行結果
>>gets1⏎
>123⏎
[123]
>あいうえお⏎
[あいうえお]
>⏎
>>■
対話的な文字列入力の注意
標準入力から文字列を入力する。改行文字のみを入力した場合、配列の内容が不変です。
// gets2.c
#include <stdio.h> // gets,printf,putchar
#include <string.h> // strcmp,strcpy
#include <stdlib.h> // EXIT_SUCCESS
int main(void)
{
char s1[256]="初期データ"; // 配列宣言
char s2[256]="初期データ"; // 配列宣言
while(1)
{
char *p;
putchar('>'); // プロンプト
p=gets(s1);
if(p==NULL)printf("NULL[%s][%s]\n",s1,s2);
else printf(" [%s][%s]\n",s1,s2);
if(strcmp(s1,s2)==0)break; // 改行のみ
strcpy(s2,s1);
} // while
return EXIT_SUCCESS;
} // main
実行結果
>>gets2⏎
>aaa⏎
[aaa][初期データ]
>bbb⏎
[bbb][aaa]
>ccc⏎
[ccc][bbb]
>⏎
NULL[ccc][ccc] …… ⏎のみでは配列不変
>>■
>>gets2⏎
>aaa⏎
[aaa][初期データ]
>bbb⏎
[bbb][aaa]
>ccc⏎
[ccc][bbb]
>^Z⏎ …… [CTRL]+[Z]
NULL[ccc][ccc] …… ^Zのみでは配列不変
>>■
HIR-NET Home
運営者
オンラインソフト
運営者著書
CG
HIR-NETリンク集
◆リンクは、ご自由にお張りください。
Copyright © 1988-2017 Hirabayashi Masahide プライバシーポリシー