HIR-NET Home 運営者 オンラインソフト 運営者著書 CG HIR-NETリンク集
Tweet このエントリーをはてなブックマークに追加
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  プライバシーポリシー